目录
迭代器
可迭代对象:可以直接作用在for循环的对象都可以称为可迭代对象
(Iterable) : 可以使用isinstance()去判断一个对象是否为Iterable对象
可以直接作用在for循环的数据类型一般分2类:
- 集合数据类型:list、tuple、dict、set、string
- 生成器generator:包括生成器和带yield的generator function
判断迭代对象:
#导入包
from collections.abc import Iterable
print(isinstance([], Iterable))
print(isinstance((), Iterable))
print(isinstance("", Iterable))
print(isinstance({}, Iterable))
print(isinstance((x for x in range(10)), Iterable))
print(isinstance(3, Iterable))
迭代器:不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出一个StopIteration错误表示无法返回下一个值
判断迭代器:
#导入包
from collections.abc import Iterator
print(isinstance([], Iterator))
print(isinstance((), Iterator))
print(isinstance("", Iterator))
print(isinstance({}, Iterator))
print(isinstance((x for x in range(10)), Iterator))
print(isinstance(3, Iterator))
将迭代对象转换为迭代器:
a = [1,2,3,4,5]
b = iter(a)
print(next(b))
输入几行数据,直到输入end才能结束,将前面所有的输入都打印出来
#导入包
from collections.abc import Iterator
end = "end"
str = ""
for line in iter(input,end):
str += line + "\n"
print(str)
函数
格式:
def 函数名(参数1,参数2.....参数n)
语句
return 表达式
def:函数代码块从def关键字开始
函数名遵循标识符规则
def myprint():
a = "boy"
print(a)
myprint()
def sum(a,b):
print(a+b)
sum(2,5)
参数传递
值传递:传递不可变类型
string,tuple,number不可变
def sum(n):
print(id(n))
n = 10
print(n)
n = 20
sum(n)
print(n)
引用传递:传递的可变类型
list,dict,set可变
def sum(n):
n[0] = 10
print(n)
n = [1,2,3,4]
sum(n)
关键字参数
允许函数调用时的顺序与定义时不一致
def sum(n,m):
print(n,m)
sum(m=10,n=20)
默认参数
调用参数时,如果没有传递参数,则使用默认参数
如果要使用默认参数,最后将默认参数放到最后
def sum(n='aaa',m='ccc'):
print(n,m)
sum(m=10,n=20)
def sum(n='aaa',m='ccc'):
print(n,m)
sum()
不定长参数
能处理比定义时更多的参数
加了*的变量能存放所有未命名的变量参数,如果没有指定参数,就是一个空元组
def sum(*arr):
print(arr)
sum('aaa','bbb','ccc','ddd')
def sum(*arr):
print(arr)
sum()
加了**的变量生成的是字典,**代表键值对的参数
def dict(**arr):
print(arr)
dict(a=1,b=2,c=3)
匿名函数
当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数。
不能使用def定义函数,使用lambda来定义函数
特点:
1.lambda只是一个表达式,函数体比def简单
2.lambda主体只是一个表达式,而不是一个代码块,仅仅只能在lambda中封装简单的逻辑
3.lambda有自己的命名空间,且不能访问自由参数之外的参数或全局命名空间的参数
4.虽然lambda是一个表达式,且只能写一行,与C/C++中的内联函数不同。内联函数是为了占用更小的占空间而增加运行效率
格式:lambda 参数1,参数2,参数3....参数n:expression(表达式)
sum = lambda n,m,k : n+m-k
print(sum(3,4,5)) #3+4-5=2