Python学习笔记(四)
一、迭代器
1. 可迭代对象与迭代器对象
(1)什么是可迭代对象
在Python中,把可以通过for…in…这类语句迭代,读取一条数据供我们使用的对象称之为可迭代对象(Iterable)。列表、元组、字符串、字典都是可迭代对象。
(2)可迭代对象与迭代器对象
迭代器对象可以调用next方法,可迭代对象需要先转换为迭代器对象才能调用next方法
(3)判断是否为可迭代对象
isinstance(对象名,Iterable)
(4)判断是否为迭代器对象
iter(对象名) is 对象名
from collections.abc import Iterable
l = [1, 2, 3]
print(isinstance(l, Iterable)) # True
print(iter(l) is l) # False
2. 迭代器协议
对象需要实现__next__()方法和__iter__()方法
3. 迭代器函数
- 对象方法
对象名.__next__()
对象名.__iter__()
- 全局方法
next()
iter() 该函数返回迭代器对象
4. 创建迭代器
需要实现类的__iter__()方法和__next__()方法
class MyNumbers:
def __iter__(self):
self.a = 1
return self
def __next__(self):
x = self.a
self.a += 1
return x
二、函数
1. 函数的作用
- 提高代码的重复利用率,避免重复开发相同代码
- 提高程序的开发效率
- 便于程序维护
2. 函数的类型
(1)无参数无返回值
def 函数名():
函数内容
(2)无参数有返回值
def 函数名():
函数内容
return 返回内容
(3)有参数无返回值
def 函数名(参数1, 参数2, ...):
函数内容
(4)有参数有返回值
def 函数名(参数1, 参数2, ...):
函数内容
return 返回内容
(5)带有默认值的函数
def 函数名(参数1 = , 参数2 = , ...):
函数内容
3. 变量的作用域
变量的作用域就是指变量的有效范围。
(1)变量分类
全局变量:在所有函数外部声明的变量就是全局变量
局部变量:仅在函数内部可以使用的变量称之为局部变量
(2)global 关键字
global的作用就是把局部变量提升为全局变量
a = 1
def fun():
global a
a = 2
fun()
print(a)
(3)nonlocal 关键字
nolocal关键字可以使用外部函数的变量
def fun1():
a = 10
def fun2():
nolocal a = 20 # 这时外部函数的变量a发生改变
print(a)
print(a)
4. 参数匹配
- 位置参数
就是按照形参的顺序,依次进行匹配 - 关键字匹配
def fun(a, b):
print(a + b)
fun(a=1, b=2)
- 默认参数
def fun(a = 1, b = 2): # 注意:如果有默认值参数,需要放到参数列表的最后
print(a + b)
fun(1)
- *args(元组)
def fun(*args):
print(sum(args))
fun(1, 2, 3, 4, 5....)
注意:(1)对于参数中只有一个*args的情况,如果没有传参数会抛出异常
def fun(*args):
pass
fun() # 错误
(2)传值时不能直接传元组
l = (1, 2, 3, 4)
fun(l) # 错误
fun(*l) # 正确
- **kwargs(字典)
def fun(**kwargs):
print(kwargs)
fun(a = 10, b = 20.....)
注意: 不能直接传入字典,如果需要传入,需要进行解包
d = {"name":"Tom", "age":18}
def fun(**kwargs):
print(kwargs)
fun(d) # 错误
fun(**d) # 正确
5. lambda 表达式
特点: 省略函数名
格式:f = lambda 参数列表:函数内容
f = lambda a, b : print(a + b)
f(2, 3)
6. 函数高级工具
(1)map
通过自定义的函数,对序列中每个元素,做一个数学上的代换,返回迭代器
map(fun,sequence)
a = [1,2,3,4,5,6,7,8,9]
b = [2,3,4,5,6,7,8,9,0]
def fun(a):
return a+1
# 方法一
res = map(lambda x,y:x+y,a,b)
print(res) # 这是一个迭代器对象
print(list(res)) # 这个才是结果
# 方法二
res1 = map(fun,a)
print(res1)
print(list(res1))
(2)filter
通过自定义的函数,对序列中每组元素做过滤,返回过滤后的迭代器
filter(fun,sequence)
a = [1,2,3,4,5,6,7,8,9]
def fun(a):
return a % 2 ==0
res = filter(lambda x:x>5,a)
print(res)
print(list(res))
res1 = filter(fun,a)
print(res1)
print(list(res1))