【飞桨】百度飞桨领航团-python查缺补漏笔记
发布于2021-02 浏览:504 回复:0
0
收藏
最后编辑于2022-04

以下笔记来源于课程《百度飞桨领航团零基础Python速成营》,小白入门安利

课程链接https://aistudio.baidu.com/aistudio/course/introduce/7073

一、函数

参数传递方法:位置参数、缺省参数、可变参数、关键字参数、命名关键字参数

(1)位置参数是最简单的一种函数调用的方式。位置参数须以正确的顺序传入函数、数量必须和声明时的一样。

def student_name_and_age(name, age):
    print('姓名:%s 年龄 %s' %(name, age))

student_name_and_age('张三', 18)

(2)缺省参数:调用函数时,缺省参数的值如果没有传入,则被认为是默认值。

def student_name_and_age(name, age='不愿透露'):
    "设置默认参数"
    print('姓名:%s 年龄 %s' %(name, age))

student_name_and_age('张三')

(3)可变参数:顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。这些可变参数在函数调用时自动组装为一个tuple。

def all_student_names(*names):
    for name in names:
        print('姓名:', name)

all_student_names('张三','李四','王五')

(4)关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。

def student_info(name, age, **kw):
    print(f'我的名字叫:{name},年龄:{age},其它信息:{kw}')

student_info('张三', 18, height=180, city='北京')

(5)命名关键字参数:如果要限制关键字参数的名字,就可以用命名关键字参数。

def print_person_info(name, age, *, height, weight):
    print('我的名字叫:', name, '年龄:', age,'身高', height, '体重', weight)

print_person_info('张三', 18, height=180, weight=75)

(6)参数的组合:在Python中定义函数,可以对以上5种参数进行组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

def student_info(name, age=18, *books, city, **kw):
    # 如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
    print('我的名字叫:', name, '年龄:', age,'其它信息:',kw)
    print('来自:', city)
    for book in books:
        print('我有',book,'书')

student_info('张三', 18, '语文','数学','计算机', city='北京', height=180, weight=75)

高阶函数:一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数。

def func_x(x, f):
    return f(x)
int2str = lambda x : str(x)

func_x(-112, int2str)

reduce函数:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,依此类推,最后得到一个结果。

from functools import reduce
mul_xy = lambda x, y: x*y
# 完成累乘运算
reduce(mul_xy, [1, 3, 5, 7, 9])

print函数:格式化输出

name = 'Molly'
hight = 170.4
score_math = 95
score_english = 89
print('大家好!我叫%s,我的身高是%d cm, 数学成绩%d分,英语成绩%d分' % (name, hight, score_math, score_english))

print('大家好!我叫{:s},我的身高是{:d} cm, 数学成绩{:d}分,英语成绩{}分'.format(name, int(hight), score_math, score_english))

print(f"大家好!我叫{name},我的身高是{int(hight)} cm, 数学成绩{score_math}分,英语成绩{score_english}分")

闭包:python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure).

def create_pointer(my_string):
    def pointer(n):
        return my_string[n]
    return pointer

装饰器:函数作为返回值。顾名思义,从字面意思就可以理解,它是用来"装饰"Python的工具,使得代码更具有Python简洁的风格。换句话说,它是一种函数的函数,因为装饰器传入的参数就是一个函数,然后通过实现各种功能来对这个函数的功能进行增强。

# 装饰器输入一个函数,输出一个函数
def print_working(func):
    def wrapper():
        print(f'{func.__name__} is working...')
        func()
    return wrapper

def worker1():
    print('我是一个勤劳的工作者!')

worker1 = print_working(worker1)
worker1()

另一种写法:

@print_working
def worker1():
    print('我是一个勤劳的工作者!')

worker1()

偏函数:通过设定参数的默认值,降低函数调用的难度。

from functools import partial
def student_info(name, age, city):
    print(f'我的名字叫{name}, 今年{age}岁,来自{city}')

student_info_beijing = partial(student_info, city='北京')

student_info_beijing('Molly',18)

二、类

私用属性和方法的定义:在属性和方法名前加 __ 两个下划线

class Athlete:
    def __init__(self,a_name,a_dob=None,a_times=[]):
        self.__name = a_name
        self.dob = a_dob
        self.times = a_times
       
    def sayName(self):
        print(self.__name)
        
    def top3(self):
        return sorted(set([self.__sanitize(t) for t in self.times]))[0:3]
        
    def __sanitize(self,time_string):
        if '-' in time_string:
            splitter = '-'
        elif ':' in time_string:
            splitter = ':'
        else:
            return (time_string)
        (mins,secs) = time_string.split(splitter)
        return (mins+'.'+secs)

子类定义:如果子类有新增的属性,那么需要在子类__init方法中,调用父类的__init__;如果子类没有新增的属性,子类不需要写__init__方法。

class Rugby(Athlete):
    def __init__(self,a_name,a_bod,a_squat,a_times):

        Athlete.__init__(self,a_name,a_bod,a_times)

        self.squat = a_squat
    def top3(self):
        return sorted([self.sanitize(t) for t in self.times])[-3:]

多态性:一个事物多种形态。多态的好处是:减少重复代码,分离经常改变的代码与不经常改变的代码,使得代码可维护性提高。

下面例子中print_rugby的参数athlete,athlete.name,athlete.top3()的行为由athlete的子类决定。

loren = get_coach_data('mywork/loren.txt')
mark = get_coach_data('mywork/mark.txt')

loren = Rugby(loren.pop(0),loren.pop(0),loren.pop(0),loren)
mark = OtherAthlete(mark.pop(0),mark.pop(0),mark.pop(0),mark)

def print_rugby(athlete):

    print(athlete.name)
    print(athlete.dob)
    print(athlete.squat)
    print(athlete.top3())

print_rugby(loren)
print_rugby(mark)

多继承

#多个父类有相同的属性或方法名,这种情况应该避免
class Father(): 
    def __init__(self):
        self.color = 'black'
    def talk(self):
        print("---爸爸的表达能力---")

class Mather():
    def __init__(self):
        self.height = 170
    def smart(self):
        print("---妈妈聪明的头脑---")

class Child(Father,Mather):
    def __init__(self):
        Father.__init__(self)
        Mather.__init__(self)

child1 = Child()
child1.talk()
child1.smart()
print(child1.color)
print(child1.height)

 

收藏
点赞
0
个赞
TOP
切换版块