def student_name(name): # 函数冒号起始,下面缩进代表以下都是该函数的内容
"打印学生的名字" # 相当于函数的注释,解释函数的功能
print('姓名:', name)
return {
'姓名':name}
返回多个值。
def student_name_and_age():
name = input('请输入姓名\n')
age = int(input('请输入年龄\n'))
return name,age
rst = student_name_and_age() # 默认返回一个tuple
name, age = student_name_and_age() # 将tuple的值拆分,依次返回至每一个变量
函数的嵌套调用
def worker(s):
rst = 10 / float(s)
return rst
def group_leader(s):
rst = worker(s) * 2
return rst
def CTO(s):
return group_leader(s)
位置参数是最简单的一种函数调用的方式。位置参数须以正确的顺序传入函数,数量必须和声明时的一样。
def student_name_and_age(name, age):
...
student_name_and_age('叶锴',24)
调用函数时,缺省参数的值如果没有传入,则被认为是默认值。
def student_name_and_age(name, age='不愿透露'):
...
student_name_and_age('叶锴')
student_name_and_age('赵一默',25)
传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个,这些可变参数在函数调用时自动组装为一个tuple。
def all_student_names(*names):
...
all_student_names('叶锴','赵一默','李默')
允许传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。
def student_info(name, age, **kw):
print(f'我的名字叫:{name},年龄:{age},其他信息:{kw}')
if 'city' in kw:
print(',来自:', kw['city'])
student_info('叶锴', 24, height=187, city='北京')
def score_info(name, **kw):
if '语文成绩' in kw:
print(name, '的语文成绩:', kw['语文'])
if '数学成绩' in kw:
print(name, '的数学成绩:', kw['数学'])
def person_info(name, age, **kw):
print('姓名:', name, ',年龄', age)
score_info(name, **kw)
score_cfg = {
'语文':89, '数学':95}
person_info('叶锴', 19, **score_cfg)
如果要限制关键字参数的名字,可以用命名关键字参数。
def print_person_info(name, age, *, height, weight): # *号后的参数都叫命名关键字参数
print(...)
print_person_info('叶锴', 19, height=187, weight=62.5) # 命名关键字参数调用时必须写清参数名
在定义函数时,可以组合使用以上5种参数。但是,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。
注意:最好不要同时组合太多。
def student_info(name, age=18, *books, city, **kw):
# 如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了
...
student_info('叶锴',19, '高数','线代','英语', city='北京', height=187, weight=63)
def change_my_name():
global name # 当函数中对外面的某一变量赋值时,默认这个变量为局部变量。因此,在赋值前想调用该变量时,需定义global变量,才能调用该变量在外面定义的值
print('我的名字曾经是', name)
name = '叶锴'
print('我的名字现在是', name)
name = '叶君'
change_my_name()
lambda的主体是一个表达式,而不是一个代码块,仅仅能在lambda表达式中封装有限的逻辑进去。
lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
# lambda 若干个输入参数 : 返回值的表达式
(lambda arg1, arg2: arg1 + arg2)(1, 2)
add = lambda arg1, arg2: arg1 + arg2
add(1, 2)
# 函数名其实就说指向函数的变量
my_print = print
my_print('a')
# 函数名也可以作为一个变量,传入其他函数
def func_x(x, f):
return f(x)
func_x(-1, abs) # abs为绝对值函数
一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数。
map()函数接受两个参数,一个是函数,一个是iterable(可迭代对象)。map将传入的函数依次作用到序列的每个元素,并把结果作为新的iterator返回。
用传给reduce中的函数function(两个参数)先对集合中的第1、2个元素进行操作,得到的结果再与第三个数据用function函数运算,依此类推,最后得到一个结果。
默认按照升序排序,当声明reverse=True时降序排序。
闭包从表现形式上定义为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。
注意:返回闭包时,返回函数不要引用任何循环变量,或后续会发生变化的变量。
用来“装饰”Python的用具,使得代码更具有Python简洁的风格。换句话说,它是一种函数的函数,因为装饰器传入的参数就说一个函数,然后通过实现各种功能来对这个函数的功能进行增强。
# 装饰器输入一个函数,输出一个函数
def print_working(func):
def wrapper():
print(f'{func.__name__} is working...')
func()
return wrapper
装饰器最大的优势是用于解决重复性的操作,其主要使用的场景如下:
通过设定参数的默认值,降低函数调用的难度。