以下笔记来源于课程《百度飞桨领航团零基础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)