在编程语言里,函数是一个组织好的,实现某一具体功能的代码块。它实现了代码的一次编写,多次、重复使用的要求。如前文,我们使用了print()这个函数,print就是函数名,名字加上“()”后就是函数的一次调用。调用时的数据传递,就是将自己的目标数据赋值给括号内函数接口参数(通常由位置参数、关键字参数构成)。
P1、函数定义
在Python中,函数定义使用关键字def,函数名为自己命名的标识符,用圆括号传入参数,加冒号并换行编写函数体(函数体和函数定义头之间用缩进做语句分级,识别函数体范围)。如下:
注:
def : 函数定义关键字;
add :自定义函数名称,使用合法标识符;
() : 函数接口,内部可以放置具体的接口参数;
x,y=0 : 函数的两个接口参数,其中,x为位置参数(不设初始值),y为关键字参数(设初始值);
s = x +y : 函数体的运算部分;
return s : 函数的返回值,默认返回null;
定义示例:
def add(x,y=0): s = x + y return s
P2、函数调用与参数传递
函数调用只需要将函数名、函数接口、参数写到需要的代码部分即可。如下函数调用:
根据函数定义add()函数有两个接口参数x,y。但x在函数定义时仅仅占位,所以叫做位置参数;而y在函数定义时进行了初始赋值,所以叫关键字参数。在进行调用时,位置参数必须提供传入实参数(上述为a),而关键字参数可以不传(值为定义时所赋值)。
示例:
a = 10b = 20s = add(10,20)print(s) # 输出 30s = add(x=10,y=20)print(s)# 输出 30s = add(10)# 输出 10s = add()Traceback (most recent call last): File "<python-input-1>", line 1, in <module> add() ~~~^^TypeError: add() missing 1 required positional argument: 'x'
可以看到,前三个调用都没有出错,但最后一个调用出错,这是因为位置参数必须提供确定的值,否则会因为其没有初始化内部变量而报错。
有的时候,我们期望自己可以传入不定长参数,就是说不知道参数有都少个。此时,可以使用*传输不定长位置参数(实际封装为元组)、或者使用**传输不定长关键字参数(实际封装为字典)。
不定长位置参数,示例:
def add(*nums): s = 0 print(type(nums)) for i in nums: s += i return sadd(1,2,3,4)
<class 'tuple'> # 这个是内部的print结果 10 # 这个是函数输出结果
def pp(**animal): print(type(animal)) for k,v in animal.items(): print(k,v)pp(bird='Rose',dog='Tom',pig='Jack')
<class 'dict'>bird Rosedog Tompig Jack
这里没有设置返回值,函数默认返回为空。但函数内部进行了输入参数类型打印和具体key:value的打印。
P3、函数作用域
变量有的作用域,通过隔文件、函数、类等进行作用域空间划分。比如,函数内定义的变量在函数外是无法访问的,这叫局部变量。而函数外定义的变量,不会和函数内部产生冲突,当然可以通过global关键字让外部变量在函数内使用。
全局变量和局部变量同名,不会冲突。演示如下:
num = 0 # 此处为全局变量 def add(n): num = 0 # 此处为局部变量,和外部不冲突。 num +=n print(f'inner:{num=}')add(2)print(f'outer:{num=}')
上面的输出是各自独立的,现在来改变一下情况:
num = 0 # 此处为全局变量 def add(n): global num # 此处为说明内部需要使用全局变量num。 num +=n print(f'inner:{num=}')add(2)print(f'outer:{num=}')
此时,让add(3)再次执行,看看会如何:
add(3)print(f'outer:{num=}')
P4、匿名函数
上面定义的函数适合函数功能复杂的情况,而当函数仅仅是临时使用,就没有必要这么多代码了,看起来非常混乱。对此,Python中引入了匿名函数的概念,它使用lambda关键字定义,可以实现单行定义一个函数。如下:
add = lambda x,y:x+yadd(10,20)# 输出 30
上述代码展示了一个匿名函数的定义过程。匿名函数使用lambda定义,且其不能引用外部变量,仅可访问自身定义的局部变量。
P5、内置函数
Python中有很多内置函数,无需我们自己再定义就可以使用,下面介绍主要的一些内置函数:
# 输出函数,用于结果输出 print('Hello') # 输出:Hello # 绝对值函数 abs(-1) # 输出:1# 最大值函数 max([1,2,5,3]) # 输出:5# 最小值函数 min([1,2,5,3]) # 输出:1# 求和函数sum([1,2,5,3]) # 输出:11
上述这些内置函数都是常用的简单函数。另外,我们应该掌握3个稍微复杂的函数,如下:# map()函数实现逐个元素计算并返回一个迭代器。第一个参数为函数,第二个为序列 s = map(lambda x:x**2 ,[1,2,3])print(list(s))#输出为:[1,4,9]# filter()函数实现逐个元素的过滤功能。第一个参数为函数,第二个为序列s = filter(lambda x:x%2==0 ,[1,2,3,4,5])print(list(s))# 输出为:[2,4]# zip()函数实现多个序列的逐个配对、重组。要求各序列长度一致,否则以最短的序列长度为准进行输出 s = zip([1,2,3],[11,22,33])print(list(s))# 输出为:[(1, 11), (2, 22), (3, 33)]
上述的内置函数都是Python自带的,当然还有很多其它的内置函数,在后面学习的时候用到再提,这里不做过多说明。-------------------------它是数字世界里的一把杀猪刀
却总能巧夺天工
它的世界是纯粹0、1组合
却总能创造无尽幻想
......
本公众号关注数据价值分析、编程学习,将不定期更新社会热点数据分析结果、编程技巧,分享数据分析工具、方法、学习等内容,欢迎有兴趣的小伙伴加入。