定义函数
- 函数代码快以def关键字开头,后接函数标识符名称和圆括号()
- 任何传入参数和自变量必须放在圆括号中间
- 函数的第一行语句可以选择性地使用文档字符串--用于存放函数说明
- 函数内存以冒号起始,并且缩进
image.png
函数参数--必备参数
函数定义中允许拥有多个参数,因此函数在调用的时候,也可能包含多个实参,向函数传递参数的方式有很多,通过实参和形参的顺序对应,这就是位置实参,只有位置一致,才能被正确匹配。位置实参是最简单也是最常用的关联方式
image.png
函数参数--关键字参数
关键字实参是传递给函数名称-值对。 直接在实参中将名称和值关联起来,因此向后函数传递实参时不会混淆,函数调用使用关键字参数来确定传入的值,使用关键字参数允许调用时参数的顺序与声明时不一致,因为Pythin解释器能够用参数名匹配参数值
image.png
函数参数-- 参数默认值
函数定义的时候,设置的参数是形参,那么也可以给每个形参指定一个默认值。当调用函数时,如果没有传入实参,就使用形参的默认值,如果调用的时候传入了实参,那么程序将使用传入的实参
image.png
函数参数-- 不定长参数
一个函数能处理比当初声明更多的参数,这些参数叫做不定长参数
image.png
image.png
函数参数--可变对象与不可变对象
不可变类型:如 整数、字符串、元祖。如fun(a),传递的只是a的值,没有影响a对象本身, 比如在fun(a)内部修改a的值,只是修改另一个复制的对象,不会影响a本身。
可变类型: 如列表,字典,如fun(la),则是将la真正的传过去,修改后fun外部的la也会受影响
函数返回值
什么是返回值
函数并非总是将结果直接输出,相反,函数额调用者需要函数提供一些通过函数处理过后的一个或者一组数据,只是调用者拥有了这个数据,才能做一些其他的操作,那么这个时候,就需要函数返回给调用者数据,这个就被称为返回值,想要在函数中把结果返回给调用者,需要在函数中使用return
return 语句
return 语句用于退出函数,选择性的向调用者返回一个表达式,直接return的语句返回 None
-
示例
image.png
接受返回值
我们可以将函数的返回值保存在变量中
image.png
函数类型
- 无参数,无返回值的函数
- 无参数, 有返回值的函数
- 有参数, 无返回值的函数
- 有参数,有返回值的函数
什么是yield呢?
yield的作用就是把一个函数变成一个generator,带有yield的函数不再是一个普通函数,Python解释器会将其视为一个生产器,如调用Xum函数,不会执行该函数,而是返回一个iterable迭代对象!
区别:与returne类型,都可以返回值,但不一样的地方,yield可以返多次,而 return只能返回一次
迭代器
迭代器迭代是Python最强大的功能之一,是访问集合元素的一种方式,
迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开发访问,直到所有元素被访问完结束。
迭代器智能往前不会后退。迭代器有两个基本的方法,iter()和next(). 字符串,列表或元祖,集合对象都可用于创建迭代器:
list = [1, 2, 3, 4]
it = iter(list)
print(next(it))
输出:1
print(next(it))
输出:2
生成器 (generator)
使用了yield的函数被称为生成器。
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器
在调用生成器运行的过程中,每次遇到yield时函数会暂停并保存当前所有的运行信息,返回yield的值并在下一次从当前位置继续运行
注意:可以通过for循环或者手动调用Xun(5)的next()方法
image.png
生成器-send
a = yield 1 这个表达式,如果这个表达式只是x=1,相信每个人都能理解是把1的值赋值给了x,而现在等号右边是一个yield1,所以先要执行yield1,然后才是赋值 ,yield把1值返回到了调用者哪里,因为执行等号右边的 yield就是暂停 ,所以不会对a赋值,而这个表达式的下一步操作,赋值缺换句话说a = yield 1只执行了一半,而send()里面的值得作用是把值传进当前的yield中
变量的作用域
一个程序的所有的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的
变量的作用域决定了在那一部分程序你可以访问哪个特定的变量名称,两种最基本的变量作用域如下:
- 全局变量
- 局部变量
定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域
可变类型的全局变量
- 对于不可变类型的全局变量来说,要在函数中修改需要global声明
- 对于可变类型的全局变量来说,要在函数中修改可以不使用global声明
局部变量
什么是局部变量
image.png
- 局部变量,就是在函数内部定义的变量
- 不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响
全局变量
-
全局变量是声明在函数外部的变量,定义在函数外的拥有全局作用域
image.png
修改全局变量
-
关键字
要想在函数内部修改全局标变量需要使用global关键字声明
image.png
匿名函数
定义函数的过程中,没有给定的名称就叫做匿名函数,Python中使用lambda表达式来创建匿名函数
lambda 来创建匿名函数规制:
- lambda 只是一个表达式,函数体比def 简单很多
-lambda 的主体是一个表达式,而不是一个代码块,所以不能写太多的逻辑进去
-lambda 函数拥有自己的命名空间,且不能访问自由参数列表之外或全局命名空间里的参数。
-lambda 定义的函数的返回值就是表达式的返回值,不需要return 语句块
-lambda 表达式的主要应用场景就是赋值给变量、作为参数传入其它函数
- lambda 匿名函数的表达式规制是:lambda 参数列表:表达式
'''
匿名函数
lambda def [参数](): 表达式 return xx
默认会返回一个表达式
'''
#没有参数的lambda表达式
# s = lambda : '哈哈啊哈' #通过;lambda 声明一个匿名函数 并且 赋值给 s
# print(s()) #通过s调用匿名函数
#声明一个参数
# s = lambda x: x*2
# print(s(3))
# s = lambda x,y: x+y
# print(s(3,4))
'''
矢量化的三元运算符
if 条件:
代码块哦
else:
代码块
条件成立的内容 if 条件 else 条件不成立的内容
'''
s = lambda x,y: x if x > 2 else y
print(s(1,4))
递归函数
- 递归函数:递归就是子程序(或函数)直接调用自己或通过一系列调用语句简介调用自己,是一种描述问题和解决问题的基本方法。(一句话,自己调用自己)
内置函数与高阶函数
-
内置函数
-
常用高阶函数
list01 = [1,3,5,7,9]
#map
nlist02 = [2,4,6,8,10]
new_list = map(lambda x,y:x*y,list01,list02)
print(list(new_list)) #将map对象转换为list
for i in new_list:
print(i)
#filter
list02 = [2,4,6,8,10]
new_list = filter(lambda x:x>4,list02)
print(list(new_list))
# for i in new_list:
print(i)
#reduce
from functools import reduce
list02 = [2,4,6,8,10]
new_list = reduce(lambda x,y:x+y,list02,0)
print(new_list)
网友评论