目录
1、函数
1.1 函数参数
1.2 函数的返回值return
1.3 变量的作用域
1.4 回调函数
1.5 闭包函数
1.6 匿名函数 lambda(表达式)
1.7 迭代器 (iterator)
1、函数
1.1 函数参数
函数参数包括普通参数(位置参数),默认参数,收集参数,命名关键字参数,关键字收集参数。对于普通参数和默认参数,是日常所见的。
收集参数:专门收集多余的实参,或者理解为不确定需要传递多少个实参,直接用一个形参来接收。
def func(sign, *args): # args为收集参数,并且args在这里为元组
if x == '+':
print(args[0] + args[1] + args[2])
elif x == '-':
print(args[0] - args[1] - args[2])
elif x == '*':
print(args[0] * args[1] * args[2])
elif x == '/':
print(args[0] / args[1] / args[2])
i = 0
while i < 4:
x = input("请输入+、-、*、/四个符号:")
func(x, 100, 200, 300)
i += 1
# 运行结果 请输入+、-、*、/四个符号:+ 600 请输入+、-、*、/四个符号:- -400 请输入+、-、*、/四个符号:* 6000000 请输入+、-、*、/四个符号:/ 0.0016666666666666668
命名关键字参数:在收集参数后面,必须通过形参的名字来进行传递
# 命名关键字参数(在收集参数后面)
def func(a, b, c=3, *args, name):
print(a, b, c)
print(args)
print(name)
func(1, 2, 3, 4, 5, 6, 7, 8, name='abcd') # 必须给命名关键字赋值
# 运行结果 1 2 3 (4, 5, 6, 7, 8) abcd
关键字参数收集:
# 关键字收集参数
def func(a, b, c, *args, name, age, **kwargs):
print(a, b, c)
print(args) # 普通收集参数,会把多余的参数收集为元组
print(name, age)
print(kwargs) # 关键字参数收集,会把多余的关键字收集为字典
func(1, 2, 3, 11, 22, 33, name='aaa', age='222', sex='ccc', weight='250')
# 运行结果
1 2 3
(11, 22, 33)
aaa 222
{'sex': 'ccc', 'weight': '250'}
1.2 函数的返回值return
在一个函数中,可以返回一些内容,也可以不返回,返回给函数调用处,用一个变量来接收。
1.3 变量的作用域
作用域:当前起作用、可用的范围区域,也可以叫变量的有效范围。有全局变量和局部变量。
全局变量:在函数内使用global关键字定义的变量就是全局变量,在函数外定义的变量,在函数内使用global关键字声明,那么也是全部变量。在函数外定义的变老了,函数可以访问,但是不能修改
局部变量:在函数内部可以使用的变量,在函数为不能使用
数据类型又分为:
可变数据类型(列表,字典):在函数外定义的变量,在函数内可以使用并且修改
不可变数据类型(其他类型):在函数外定义的变量,在函数内部只能访问,不能使用其他操作
关于函数作用域有以下两个函数
globals():获取全局变量数据
locals():获取当前作用域的数据
nonlocal关键字:在局部函数中使用。如果定义了一个函数(暂时称之为外函数),又在这个外函数里面定义了一个局部变量和一个内函数,那么如果内函数要引用这个局部变量是可以的,但是只能访问。如果要访问并且使用这个局部变量要在内函数用nonlocal关键字进行引用。
1.4 回调函数
函数中的参数可以是任意类型的,那么参数也可以是一个函数。如果一个函数中要求传递的参数是一个函数,并且在函数中使用了传递进来的参数,那么称为回调函数。
# 回调函数
def func(f):
print('这里调用了func')
f()
def function():
print('这里调用了function')
func(function) # 将函数名function当func函数的实参
# 运行结果 这里调用了func 这里调用了function
1.5 闭包函数
既然可以把函数作为一个形参进行传递,那么也可以返回一个函数,这就叫闭包函数。但是要满足条件:必须是函数内返回的内函数,并且这个返回的内函数还使用了外函数中的局部变量
# 闭包函数
def person(): # 一个获取钱
money = 0
def work(): # 工作一次加100
nonlocal money
money += 100
print(money)
return work # 返回一个函数
res = person() # return work,res = work
res() # 调用res,相当于调用了work函数
res()
# 此时,就不能够在全局中对money这个局部变量进行如何操作
# 闭包的作用:保护了函数中的变量不受外部的影响,但是又不影响使用
# 运行结果 100 200
1.6 匿名函数 lambda(表达式)
匿名函数的意思就是说可以不使用def定义,并且这个函数也没有名字。在python中可以使用lambda表达式来定义匿名函数。
注意:lambda表达式仅仅是一个表达式,不是一个代码块。所以lambda又叫做一行 代码的函数。lambda表达式也有形参,并且不能访问除了自己的形参之外的任何数据包括全局变量。
"""
lambda [参数列表]:返回值
"""
def jia(x, y):
return x+y
print(jia(2, 3))
# 改成lambda表达式来封装
res = lambda x, y: x+y
print(res(4, 4))
# lambda也可以有分支结构,但是不能写很复杂的分支
# lambda 参数列表: 真区间 if 表达式判断 else 假区间
res = lambda sex: "很man" if sex == '男' else "很漂亮"
print(res('女'))
# 输出结果 5 8 很漂亮
1.7 迭代器 (iterator)
迭代器是python中最具特色跌的功能之一,是访问集合元素的一种方式。迭代器是一个可以记住访问遍历的位置的对象,因此不会像列表那样一次性全部生成,而是可以等到用的时候才生成,因此节省了大量的内存资源。从集合的第一个元素开始访问,直到集合中的所有元素访问完毕,迭代器只能从前往后一个一个的遍历,不能后退。
迭代器:是一个能被next函数调用并不断返回下一个值的对象,称为迭代器。
# 迭代器
# range(1,10) 返回从1到9 返回一个可迭代的对象
# range(10,1,-1) 返回从10到2 返回一个可迭代的对象
# 但是数据量太大时,使用range并不能有效的实现功能
"""
iter()
功能:把可迭代的对象,转化为一个可迭代的对象
参数:可迭代的对象
返回值:迭代器对象(str, list, tuple, dict, set, range)
注意:迭代器一定是一个可以迭代的对象,但是可迭代对象不一定是迭代器,是两个不一样的概念
"""
arr = ['孙悟空', '猪八戒', '唐僧', '沙僧']
res = iter(arr)
print(res, type(res)) # 这里的res就是迭代器对象
# 使用next()函数去调用迭代器对象
r = next(res)
print(r)
print(next(res))
print(next(res))
print(next(res)) # 到这里就取完了
r = list(res)
print(r) # 输出[]空列表
# 需要注意,迭代器对象的特点是取出来就没有了,next()调用一次取出一次,直到数据取完
# 输出结果孙悟空 猪八戒 唐僧 沙僧 []
拓展:isinstance()函数
from collections.abc import Iterator, Iterable # 模块导入 var = '123456' res = iter(var) # isinstance() 检测一个数据是不是一个指定的类型,返回布尔类型 r0 = isinstance(var, str) # True r1 = isinstance(var, int) # False r2 = isinstance(var, Iterable) # True,是一个可迭代对象 r3 = isinstance(var, Iterator) # False,不是一个迭代器 r4 = isinstance(res, Iterable) # True,是可迭代对象 r5 = isinstance(res, Iterator) # True,也是一个迭代器 print(r0, r1) # 是一个字符串,不是整形 print(r2, r3, r4, r5) # 迭代器一定是一个可迭代对象,但反过来不一定是
# 结果 True False True False True True



