第五章节 函数
截止目前:面向过程编程。【可读性差/可重用性差】。
发邮件
```python
面向过程编程
user_input = input('请输入角色:')
if user_input == '管理员': import smtplib from email.mime.text import MIMEText from email.utils import formataddr
msg = MIMEText('管理员,我想演男一号,你想怎么着都行。', 'plain', 'utf-8') msg['From'] = formataddr(["李邵奇", '15776556369@163.com']) msg['To'] = formataddr(["管理员", '344522251@qq.com']) msg['Subject'] = "情爱的导演" server = smtplib.SMTP("smtp.163.com", 25) server.login("15776556369@163.com", "qq1105400511") server.sendmail('15776556369@163.com', ['管理员', ], msg.as_string()) server.quit()
elif user_input == '业务员': import smtplib from email.mime.text import MIMEText from email.utils import formataddr
msg = MIMEText('业务员,我想演男一号,你想怎么着都行。', 'plain', 'utf-8') msg['From'] = formataddr(["李邵奇", '15776556369@163.com']) msg['To'] = formataddr(["业务员", '业务员']) msg['Subject'] = "情爱的导演" server = smtplib.SMTP("smtp.163.com", 25) server.login("15776556369@163.com", "qq1105400511") server.sendmail('15776556369@163.com', ['业务员', ], msg.as_string()) server.quit()
elif user_input == '老板':1 import smtplib from email.mime.text import MIMEText from email.utils import formataddr
msg = MIMEText('老板,我想演男一号,你想怎么着都行。', 'plain', 'utf-8') msg['From'] = formataddr(["李邵奇", '15776556369@163.com']) msg['To'] = formataddr(["老板", '老板邮箱']) msg['Subject'] = "情爱的导演" server = smtplib.SMTP("smtp.163.com", 25) server.login("15776556369@163.com", "qq1105400511") server.sendmail('15776556369@163.com', ['老板邮箱', ], msg.as_string()) server.quit()
```
函数式编程:发邮件
```python def send_email(): import smtplib from email.mime.text import MIMEText from email.utils import formataddr
msg = MIMEText('老板,我想演男一号,你想怎么着都行。', 'plain', 'utf-8') msg['From'] = formataddr(["李邵奇", '15776556369@163.com']) msg['To'] = formataddr(["老板", '老板邮箱']) msg['Subject'] = "情爱的导演" server = smtplib.SMTP("smtp.163.com", 25) server.login("15776556369@163.com", "qq1105400511") server.sendmail('15776556369@163.com', ['老板邮箱', ], msg.as_string()) server.quit()
user_input = input('请输入角色:')
if userinput == '管理员': sendemail() elif userinput == '业务员': sendemail() elif userinput == '老板': sendemail() ```
函数的本质:将N行代码拿到别处,起个名字,以后通过名字就可以找到这个代码并执行。
5.1 函数的基本结构
```python
函数的基本定义
def 函数名()
函数名() #执行 ```
```python def data () v = [11,22,33] print(v[0])
data()
注意:函数如果不被调用,则内部代码永远不会被执行。
```
```python
假如:管理员/业务员/老板用的是同一个邮箱。
def send_email(): print('发送邮件成功,假设有10含代码')
user_input = input('请输入角色:')
if userinput == '管理员': sendemail() elif userinput == '业务员': sendemail() elif userinput == '老板': sendemail() ```
练习题
```python
1. 写函数,计算一个列表中有多少个数字,打印: 列表中有%s个数字。
提示:type('x') == int 判断是否是数字。
"""
方式一:
def getlistcounter1(datalist): count = 0 for item in datalist: if type(item) == int: count += 1 msg = "列表中有%s个数字" %(count,) print(msg)
getlistcounter1([1,22,3,'alex',8])
方式二:
def getlistcounter2(datalist): count = 0 for item in datalist: if type(item) == int: count += 1 return count
v = getlistcounter1([1,22,3,'alex',8]) msg = "列表中有%s个数字" %(v,) print(msg) """
2. 写函数,计算一个列表中偶数索引位置的数据构造成另外一个列表,并返回。
"""
方式一:
def getdatalist1(arg): v = arg[::2] return v
data = getdatalist1([11,22,33,44,55,66])
方式二:
def getdatalist2(arg): v = [] for i in range(0,len(arg)): if i % 2 == 0: v.append(arg[i]) return v
data = getdatalist2([11,22,33,44,55,66])
"""
3. 读取文件,将文件的内容构造成指定格式的数据,并返回。
""" a.log文件 alex|123|18 eric|uiuf|19 ... 目标结构: a. ["alex|123|18","eric|uiuf|19"] 并返回。
b. [['alex','123','18'],['eric','uiuf','19']] with open("al.txt",mode="r",encoding="utf-8") as info: a = [ ] for i in info: i = i.strip() v1 = i.split("|") a.append(v1) print(a)
c. [ {'name':'alex','pwd':'123','age':'18'}, {'name':'eric','pwd':'uiuf','age':'19'}, ] """ ```
5.11 返回值
```python def func(arg): # .... return 9 # 返回值为9 默认:return None
val = func('adsfadsf') ```
```python
1. 让用户输入一段字符串,计算字符串中有多少A字符的个数。有多少个就在文件a.txt中写多少个“李邵奇”。
def getcharcount(data): sumcounter = 0 for i in data: if i == 'A': sumcounter += 1
return sum_counter
def write_file(line): if len(line) == 0: return False # 函数执行过程中,一旦遇到return,则停止函数的执行。 with open('a.txt',mode='w',encoding='utf-8') as f: f.write(line) return True
content = input('请输入:') counter = getcharcount(content) write_data = "李邵奇" * counter status = writefile(writedata) if status: print('写入成功') else: print('写入失败')
```
5.2函数的小高级
```python a = 123 name = '老男孩好' nums = [11,22,33,4] data = nums
def func(): pass # 100行代码
func = 函数
```
5.2.1 函数名当作变量来使用
python def func(): print(123) v1 = func func() v1()
```python def func(): print(123)
func_list = [func, func, func]
func_list0
func_list1
func_list2
for item in func_list: v = item() print(v)
```
```python def func(): print(123)
def bar(): print(666)
info = {'k1': func, 'k2': bar}
python def func(): return 123 func_list1 = [func,func,func] # func 是内存地址 func_list2 = [func(),func(),func()] 执行函数。#123 print(func_list1) print(func_list2) info = { 'k1':func, 'k2':func(), } print(info)
5.2.2 函数的赋值
5.2.3 函数可以当参数进行传递
```python def func(arg): print(arg)
func(1) func([1,2,3,4])
def show(): return 999 func(show) ```
```python def func(arg): v1 = arg() print(v1)
def show(): print(666)
func(show) ```
```python def func(arg): v1 = arg() print(v1)
def show(): print(666)
result = func(show) print(result) ```
```python
面试题
def func(): print('花费查询')
def bar(): print('语音沟通')
def base(): print('xxx')
def show(): print('xxx')
def test(): print('xxx')
info = { 'f1': func, 'f2': bar, 'f3':base, 'f4':show, 'f5':test } choice = input('请选择要选择功能:') functionname = info.get(choice) if functionname: function_name() else: print('输入错误') ```
5.2 4 匿名函数lambda表达式
用于表示简单的函数。
```python
三元运算,为了解决简单的if else的情况,如:
if 1 == 1: a = 123 else: a = 456
三元运算:a = 123 if 1 == 1 else 456
lambda表达式,为了解决简单函数的情况,如:
def func(a1,a2): return a1 + 100
func = lambda a1,a2: a1+100 ```
```python func1 = lambda : 100
func2 = lambda x1: x1 * 10
func3 = lambda args,*kwargs: len(args) + len(kwargs)
DATA = 100 func4 = lambda a1: a1 + DATA v = func4(1) print(v)
DATA = 100 def func(): DATA = 1000 func4 = lambda a1: a1 + DATA v = func4(1) print(v) func()
func5 = lambda n1,n2: n1 if n1 > n2 else n2 v = func5(1111,2) print(v) ```
练习题
```python
练习题1
USERLIST = [] def func0(x): v = USERLIST.append(x) return v
result = func0('alex') print(result)
练习题2
def func0(x): v = x.strip() return v
result = func0(' alex ') print(result)
总结:列表所有方法基本上都是返回None;字符串的所有方法基本上都是返回新值
练习题3
USERLIST = [] func1 = lambda x: USERLIST.append(x)
v1 = func1('alex') print(v1) print(USER_LIST)
练习题4
func1 = lambda x: x.split('l')
v1 = func1('alex') print(v1)
练习题5
func_list = [lambda x:x.strip(), lambda y:y+199,lambda x,y:x+y]
v1 = func_list[0]('alex ') print(v1)
v2 = func_list1 print(v2)
v3 = func_list2 print(v3) ```
5.3 内置函数
-
其他:
-
len
-
open
-
range
-
id
-
type【查看类型】
-
issublass
-
isinstance【判断是否是某个类或基类的示例(对象)】
-
super【super().func() 根据self对象所属类的继承关系,按照顺序挨个找func方法并执行(到底第一个就不在找了)】
-
-
输入输出
- input
-
强制转换
- str
- list
- tuple
- set
- bool
- dict
- int
-
数学相关
- abs 将十进制转换二进制
- float
- max
- min
- sum
- divmod
- round
- pow
-
进制转换
- bin
- oct
- int
- base
- hex
- chr 将十进制数字转换成unicode 编码中的对应字符。
- ord 根据字符在unicode编码中找到其对应的十进制。
- map 有2个参数,循环每个元素(第二个参数),然后让每个元素执行(第一个参数),将每个函数执行的结果保存到新的列表中,并返回。
- filter 有2个参数,对每个元素进行筛选,得到符合条件的元素,保存到新列表。
-
reduce 必须用2个数传参,对每个元素进行累计。
-
type 【查看类型】
```python
判断是否是Foo类的实例
class Foo: pass
obj = Foo()
if type(obj) == Foo: print('obj是Foo类的对象') ```
- issubclass
```python class Base: pass
class Base1(Base): pass
class Foo(Base1): pass
class Bar: pass
print(issubclass(Bar,Base)) print(issubclass(Foo,Base)) ```
- isinstance
```python
判断是否是某个类或(基类)的实例(对象)
class Base(object): pass
class Foo(Base): pass
obj = Foo()
print(isinstance(obj,Foo)) # 判断obj是否是Foo类或其基类的实例(对象) print(isinstance(obj,Base)) # 判断obj是否是Foo类或其基类的实例(对象) ```
- super
```python class Base(object): # Base -> object def func(self): super().func() print('base.func')
class Bar(object): def func(self): print('bar.func')
class Foo(Base,Bar): # Foo -> Base -> Bar pass
obj = Foo() obj.func()
# super().func() 根据self对象所属类的继承关系,按照顺序挨个找func方法并执行(找到第一个就不在找了) ```
-
chr,将十进制数字转换成unicode 编码中的对应字符。
```python v = chr(99) print(v)
c
```
-
ord,根据字符在unicode编码中找到其对应的十进制。
```python num = ord("中") print(num)
20013
```
-
应用:
```python import random
def getrandomcode(length=6): data = [ ] for i in range(lengh): v = random.randint(65,90) data.append(chr(v))
return "".join(data)
code = getrandomcode() print(code)
```
import random # 导入一个模块
v = random.randint(起始,终止) # 得到一个随机数
-
高级一点的内置函数
-
map。有2个参数,循环每个元素(第二个参数),然后让每个元素执行(第一个参数),将每个函数执行的结果保存到新的列表中,并返回。
```python v1 = [11,22,33,44] result = map(lambda x:x+100,v1) print(list(result))
[111,122,133,144]
```
-
filter.有2个参数,对每个元素进行筛选,得到符合条件的元素,保存到新列表。
```python v1 = [11,22,33,'asd',44,'xf']
def func(x): if type(x) == int: return True return False result = filter(func,v1) # [11,] print(list(result))
result = filter(lambda x: True if type(x) == int else False ,v1) print(list(result))
result = filter(lambda x: type(x) == int ,v1) print(list(result)) ```
-
reduce.,必须用2个数传参,对每个元素进行累计。
```python import functools v1 = ['wo','hao','e']
def func(x,y): return x+y result = functools.reduce(func,v1) print(result)
result = functools.reduce(lambda x,y:x+y,v1) print(result) ```
5.4 参数:【实参 / 形参】
```python def getlistfirst_data(aaa): # aaa叫形式参数(形参) v = [11,22,33,44] print(v[aaa])
getlistfirstdata(1) # 2/2/1调用函数时传递叫:实际参数(实参) getlistfirstdata(2) getlistfirstdata(3) getlistfirstdata(0) ```
-
任意个数
-
任意类型
-
位置传参(调用函数并传入参数)
```python def func(a1,a2) print(a1,a2)
func() ```
- 关键字传参
```python def func(a1,a2) print(a1,a2)
func(a1=5,a2=10) ```
- 默认参数定义
```python # 自定义函数 def func():
func()
# 内置函数 open() len() ```
```python def func (a1,a2,a3= 9,a4= 10): print(a1,a2,a3,a4)
func 函数接受两个参数,调用函数进行传值时: func (1,2,) func(1,2,10) func(1,2,10,100) func(1,2,10,a4=100) func(1,2,a3=10,a4=100) ```
-
万能参数(打散参数。*args)
-
【直接说位置传参】
-
接受任意个数的位置参数,并转换成元组
-
调用函数无*
``` python def func (*args): print(args)
func(1,2,3,4) #(1,2,3,4)
def func (args): print(args)
func(1,2,3,4) # 1,2,3,4 ```
- 调用函数有**
```python def func(*args) print(args)
func((1,2,3,4)) #(1,2,3,4) func([1,2,3,4]) #(1,2,3,4)
def func(args) print(args)
func((1,2,3,4)) # 1,2,3,4 func({1,2,3,4}) # 1,2,3,4 func(*[1,2,3,4]) # 1,2,3,4 ```
-
-
**kwargs【关键字传参】
-
接受任意关键字传参,并将转换成字典
-
调用参数无*
```python def func(**kwargs): print(kwargs)
func(k1=1,k2=2) # {k1:1,k2:2} ```
- 调用参数有*
```python def func(**kwargs) print(kwargs)
func(**{"k1":"v1","k2":"v2"}) #{"k1":"v1","k2":"v2"}
```
-
-
综合
发邮件
```python
假如:管理员/业务员/老板用的是同一个邮箱。
""" def send_email(to): import smtplib from email.mime.text import MIMEText from email.utils import formataddr
msg = MIMEText('导演,我想演男一号,你想怎么着都行。', 'plain', 'utf-8') msg['From'] = formataddr(["李邵奇", '15776556369@163.com']) msg['To'] = formataddr(["导演", to]) msg['Subject'] = "情爱的导演" server = smtplib.SMTP("smtp.163.com", 25) server.login("15776556369@163.com", "qq1105400511") server.sendmail('15776556369@163.com', [to, ], msg.as_string()) server.quit()
""" def send_email(to): template = "要给%s发送邮件" %(to,) print(template)
user_input = input('请输入角色:')
if userinput == '管理员': sendemail('xxxx@qq.com') elif userinput == '业务员': sendemail('xxxxo@qq.com') elif userinput == '老板': sendemail('xoxox@qq.com') ```
练习题
```python
1、请写一个函数,函数计算列表info = [11,22,33,44,55] 中所有元素的和。
def info( ): info = [11, 22, 33, 44, 55] count = 0 for i in info: count += i print(count) info()
2.请写一个函数,函数计算列表中所有元素的和。
def func(al): count = 0 for i in al: count += i print(count)
func([11,22,33])
- 请写一个函数,函数将两个列表拼接起来 def func (a,b): a.extend(b) print(a) func([11,22,33],[1,2,3])
- 计算一个列表的长度 def func(a): v1 = len(a) print(v1)
func([1,2,3,4,11])
```
5.41 返回值(可以返回任意类型)
```python def func (arg):
return 9 # 默认:return None
va1 = func('dfdgfth') ```
```python
1. 让用户输入一段字符串,计算字符串中有多少A字符的个数。有多少个就在文件a.txt中写多少个“李邵奇”。
def getcharcount(data): sumcounter = 0 for i in data: if i == 'A': sumcounter += 1
return sum_counter
def write_file(line): if len(line) == 0: return False # 函数执行过程中,一旦遇到return,则停止函数的执行。 with open('a.txt',mode='w',encoding='utf-8') as f: f.write(line) return True
content = input('请输入:') counter = getcharcount(content) write_data = "李邵奇" * counter status = writefile(writedata) if status: print('写入成功') else: print('写入失败')
```
5.5函数的中高级
5.5.1 函数可以做返回值
```python def func(): print(123)
def bar (): return func
v = bar() v() # 123 ```
```python nane = "oldboy" def func():
def bar (): return func v = bar() v() # oldboy
```
python def bar(): def inner(): print(123) return inner v = bar() v( ) # 123
python name = "oldboy" def bar(): name = "alex" def inner(): print(name) return inner v = bar() v() # alex
python name = "oldboy" def bar(name): def inner(): print(name) return inner v1 = bar("alex") v2 = var("aric") v1() # alex v2() #aric
练习题
```python 第一题 name = 'alex' def base(): print(name) def func(): name = 'eric' base() func() # alex
第二天 name = 'alex' def func(): name = 'eric' def base(): print(name) base() # 'eric' func() # 'eric'
第三题 name = 'alex'
def func(): name = 'eric' def base(): print(name) return base base = func() base() #'eric'
```
注意:函数在何时被谁创建?
面试题
```python info = []
def func(): print(item)
for item in range(10): info.append(func)
info0 #9 ```
```python info = []
def func(i): def inner(): print(i) return inner
for item in range(10): info.append(func(item))
info0 #0 info1 #1 info4 #4 ```
5.52 闭包
- 闭包概念:为函数创建一块区域并为其维护自己数据,以后执行方便调用。
- 应用场景:装饰器 / SOLAlchemy源码
```python def func(name): def inner(): print(name) return inner
v1 = func('alex') v1() # alex v2 = func('eric') v2() # eric ```
```python
不是闭包
def func1(name): def inner(): return 123 return inner
是闭包:封装值 + 内层函数需要使用。
def func2(name): def inner(): print(name) return 123 return inner ```
5.53 高阶函数
- 把函数当作参数传递
- 把函数当作返回值
注意:对函数进行赋值
5.6作用域
python中:
-
py 文件:全局作用域
-
函数:局部作用域
-
一个函数是一个作用域
-
作用域中查找数据规则:优先在自己作用域找数据,自己没有就去"父级"--> "父级"-->"父级"-->直到全局,全部没有就报错。注意:父级作用域中的值到底是什么?
```python a = 1 def s1(): x1 = 666 print(x1) print(a) print(b)
b = 2 print(a) s1() a = 88888 def s2(): print(a,b) s1()
s2() ```
- 作用域中查找数据规则:优先在自己作用域找数据,自己没有就去"父级"--> "父级"-->"父级"-->直到全局,全部没有就报错。注意:父级作用域中的值到底是什么?
```python x = 10 def func(): x = 9 print(x)
func() ```
练习题
```python x = 10 def func(): x = 9 print(x) def x1(): x = 999 print(x) func()
x = 10 def func(): x = 9 print(x) def x1(): x = 999 print(x) x1() func()
x = 10 def func(): x = 9 print(x) def x1(): x = 999 print(x) print(x) x1()
func()
x = 10 def func(): x = 8 print(x) def x1(): x = 999 print(x) x1() print(x) func()
x = 10 def func(): x = 8 print(x) def x1(): print(x) x1() print(x)
func()
x = 10 def func(): x = 8 print(x) def x1(): print(x) x = 9 x1() x = 10 print(x)
x = 10 def func(): x = 8 print(x) def x1(): print(x)
x1() x = 9 x1() x = 10 print(x)
func()
```
- 子作用域中只能 找到父级中的值,默认无法重现为父级的变量进行赋值。(global/nonlocal可以强制做)
```python name = 'oldboy' def func(): name = 'alex' # 在自己作用域再创建一个这样的值。 print(name) func() print(name)
# ##################### name = [1,2,43] def func(): name.append(999) print(name) func() print(name)
# ###################### 如果非要对全局的变量进行赋值 # 示例一 name = ["老男孩",'alex'] def func(): global name name = '我' func() print(name) # 示例一 name = "老男孩" def func(): name = 'alex' def inner(): global name name = 999 inner() print(name) func() print(name)
name = "老男孩" def func(): name = 'alex' def inner(): global name name = 999 inner() print(name) func() print(name)
# ############################## nonlocal name = "老男孩" def func(): name = 'alex' def inner(): nonlocal name # 找到上一级的name name = 999 inner() print(name) func() print(name) ```
- 补充:全局变量以后必须全部是大写
```python USER_LIST = [11,22,3]
def func(): name = 'asdf' USERLIST.append(12) USERLIST.append(name)
func() print(USER_LIST) ```
5.7 递归
函数自己调用自己。(效率低)
- 递归的最大次数是(1000次)
```python def func(): print(1) func()
func() ############################### ```
```python def func(i) print(i) func(i+1)
func(1) ```
```python def func(a,b): # 1 # 1 # 2 # 3 # 5 print(b) func(b,a+b)
func(0,1) ############################### def func(a): if a ==5: return 10000 result = func(a+1)+10 return result
v = func(1) ```
递归的返回值
```python def func(a) if a ==5: return 100000 result = func(a+1)+10
v = func(1) name = "alex" def func(): def inner(): print(name) return inner v = func()
```
5.8 装饰器
装饰器:在不改变原函数内部代码的基础上,在函数执行前和之后自动执行某个功能。
- .装饰器的基本格式
```python def x1(func): def inner(args,kwargs): data = func(args,kwargs) # 执行原函数并获取返回值 return data return inner
@x1 def index(): print(123)
index() ```
2.带参数的装饰器
```python def x(counter): def wrapper(func): def inner(args,kwargs): data = func(args,kwargs) # 执行原函数并获取返回值 return data return inner return wrapper
@x(9) def index(): pass ```
```python def func(): pass v = 10 v = func
def base(): print(1) def bar(): print(2)
bar = base bar() #1 ```
```python def func(): def inner(): pass return inner
v = func() print(v) # inner函数
def func(arg): def inner(): print(arg) return inner
v1 = func(1) v2 = func(2)
def func(arg): def inner(): arg() return inner
def f1(): print(123)
v1 = func(f1) v1() #123
def func(arg): def inner(): arg() return inner
def f1(): print(123) return 666
v1 = func(f1) result = v1() # 执行inner函数 / f1含函数 -> 123 print(result) # None
def func(arg): def inner(): return arg() return inner
def f1(): print(123) return 666
v1 = func(f1) result = v1() # 执行inner函数 / f1含函数 -> 123 print(result) #666
```
```python def func(arg): def inner(): print("before") v = arg print("after") return v return inner
def index(): print("123") return"666"
示例一
v1 = index() # 执行index函数,打印123并返回666赋值个v1
示例二
v2 = func(index)# v2是inner函数,arg = index函数 index = 666 v3 = v2()
示例三
v4 = func(index) index = v4 # index ==> inner index()
示例四
index = func(index) index() ```
``` def func(arg): def inner(): v = arg() return v return inner
第一步:执行func 函数并将下面的函数参数传递,相当于:func(index)
第一步:将func的返回值重新赋值给下面的函数名。index = func(index)
@func def index(): print(123) return 666
print(index)
```
应用场景:想要为函数扩展功能时,可以选择用装饰器。
```python
计算函数执行时间
def wrapper(func): def inner(): starttime = time.time() v = func() endtime = time.time() print(endtime-starttime) return v return inner
@wrapper def func1(): time.sleep(2) print(123)
@wrappen def func2(): time.sleep(1) print(123)
def func3(): time.sleep(1.5) print(123)
func1() ```
5.9 迭代器
自己不会写迭代器,只用。
任务:请展示列表中所有的数据。
-
while + 索引 + 计数器
-
迭代器,对 某种对象(str/list/tuple/dict/set类创建的对象)-可迭代对象 中的元素进行逐一获取,表象:具有
__next__
方法且每次调用都获取可迭代对象中的元素(从前到后一个一个获取)。- 列表转换成迭代器:
- v1 = iter([11,22,33,44])
- v1 = [11,22,33,44].iter()
- 迭代器想要获取每个值:反复调用 ```val = v1.next()
```python v1 = [11,22,33,44]
# 列表转换成迭代器 v2 = iter(v1) result1 = v2.next() print(result1) result2 = v2.next() print(result2) result3 = v2.next() print(result3) result4 = v2.next() print(result4) result5 = v2.next() print(result5) """ # v1 = "alex" # v2 = iter(v1) # while True: # try: # val = v2.next() # print(val) # except Exception as e: # break ```
- 直到报错: StopIteration错误,表示已经迭代完毕。
-
如何判别一个对象是否是迭代器:内部是否有
__next__方法
。 -
for 循环
```python v1 = [11,22,33,44]
# 1.内部会将v1转换成迭代器 # 2.内部反复执行 迭代器.next() # 3.取完不报错 for item in v1: print(item) ```
5.10 可迭代对象
- 内部具有
__iter__()
方法且返回一个迭代器。(*) - 可以被for 循环
python v1 = [11,22,33,44] result = v1.__iter__()
5.11生成器(函数的变异)
- 函数中如果存在yield,那么该函数就是一个生成器函数,调用生成器函数会返回一个生成器,生成器只有被for循环时,生成器函数内部的代码才会执行,每次循环都会获取yield返回的值。
```python
函数
def func(): return 123 func() ```
```python
生成器函数(内部是否包含yield)
def func(): print('F1') yield 1 print('F2') yield 2 print('F3') yield 100 print('F4')
函数内部代码不会执行,返回一个 生成器对象 。
v1 = func()
生成器是可以被for循环,一旦开始循环那么函数内部代码就会开始执行。
for item in v1: print(item) ```
```python def func(): count = 1 while True: yield count count += 1
val = func()
for item in val: print(item) ```
```python def func(): count = 1 while True: yield count count += 1 if count == 100: return
val = func() for item in val: print(item) ```
示例:读文件
```python def func(): """ 分批去读取文件中的内容,将文件的内容返回给调用者。 :return: """ cursor = 0 while True: f = open('db', 'r', encoding='utf-8')# 通过网络连接上redis # 代指 redis[0:10] f.seek(cursor) datalist =[] for i in range(10): line = f.readline() if not line: return datalist.append(line) cursor = f.tell() f.close() # 关闭与redis的连接
for row in data_list: yield row
for item in func(): print(item) ```
特殊的迭代器:
```python def func(): yield 1 yield 2 yield 3
v = func() result = v.next() print(result) result = v.next() print(result) result = v.next() print(result) result = v.next() print(result) ```
特殊的可迭代对象:
```python def func(): yield 1
v = func() result = v.iter() print(result) ```
5.12推到式
-
列表推导式【生成式】
- 基本格式
```python 目的:方便的生成一个列表。 格式: v1 = [i for i in 可迭代对象] v2 = [i for i in 可迭代对象 if 条件] # 条件为true 才进行append
v1 = [ i for i in 'alex' ] v2 = [i+100 for i in range(10)] v3 = [99 if i>5 else 66 for i in range(10)]
def func(): return 100 v4 = [func for i in range(10)]
v5 = [lambda : 100 for i in range(10)] result = v59
def func(): return i v6 = [func for i in range(10)] result = v65
v7 = [lambda :i for i in range(10)] result = v75
v8 = [lambda x:x*i for i in range(10)] # 新浪微博面试题
1.请问 v8 是什么?
2.请问 v80 的结果是什么?
面试题
def num(): return [lambda x:i*x for i in range(4)]
num() -> [函数,函数,函数,函数]
print([ m(2) for m in num() ]) # [6,6,6,6]
##################### 筛选
v9 = [i for i in range(10) if i > 5] ```
- 集合推导式
python v1 = {i for i in "alex"}
- 字典推导式
python v1 = v1 = {"k"+str(i):i for i in range(10)}
来源:https://www.cnblogs.com/wudongmin/p/12259256.html