day-5 装饰器 迭代器 生成器

1.装饰器

1.1 带参数的装饰器

参数可以用来决定是否执行某个装饰器的某一部分

def outer(flag):

def timer(func):

def inner(*args,**kwargs):

if flag:

print(‘‘‘执行函数之前要做的‘‘‘)

re = func(*args,**kwargs)

if flag:

print(‘‘‘执行函数之后要做的‘‘‘)

return re

return inner

return timer

@outer(False)

def func():

print(111)

执行结果为111

@outer(True)

def func():

print(111)

执行结果为

执行函数之前要做的

111

执行函数之后要做的

1.2多个装饰器装饰一个函数

注意执行顺序

def wrapper1(func):

def inner():

print(‘wrapper1 ,before func‘)

func()

print(‘wrapper1 ,after func‘)

return inner

def wrapper2(func):

def inner():

print(‘wrapper2 ,before func‘)

func()

print(‘wrapper2 ,after func‘)

return inner

@wrapper2

@wrapper1

def f():

print(‘in f‘)

f()

执行结果为:

wrapper2 ,before func

wrapper1 ,before func

in f

wrapper1 ,after func

wrapper2 ,after func

2.迭代器、生成器

2.1可迭代对象

字符串、列表、元组、字典、集合都可以被for循环,说明他们都是可迭代的。

from collections import Iterable

l = [1, 2, 3, 4]
t = (1, 2, 3, 4)
d = {1: 2, 3: 4}
s = {1, 2, 3, 4}
str = ‘1234‘
print (isinstance (l, Iterable))#True
print (isinstance (t, Iterable))#True
print (isinstance (d, Iterable))#True
print (isinstance (s, Iterable))#True
print (isinstance (str, Iterable))#True
 
用dir查看具有的方法,如果有__iter__则表示可迭代的。
str = ‘1234‘
print(‘__iter__‘ in dir(str))#True
 
2.2迭代器
英文为iterator;将可迭代的转化为迭代器。
l = [1,2,3,4]
l_iter = l.__iter__()  # 将可迭代的转化成迭代器
print(l_iter)# <list_iterator object at 0x000001C691D284E0>
item = l_iter.__next__()
print(item)#1
item = l_iter.__next__()
print(item)#2
 
__next__()一直向前取值,不回头。
迭代器遵循迭代器协议:必须拥有__iter__方法和__next__方法。
 
for循环,能遍历一个可迭代对象, 将可迭代对象转化成迭代器。(可迭代对象.__iter__());内部使用__next__方法,一个一个取值;加了异常处理功能,取值到底后自动停止。
 
迭代器的好处:
迭代器,在for循环时,同一时刻在内存中只出现一条数据,极大限度的节省了内存~
2.3初始生成器
1.生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便下次重它离开的地方继续执行
 
2.生成器表达式:类似于列表推导,但是,生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表
 
 
生成器Generator:
 
本质:迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现)
 
特点:惰性运算,开发者自定义
 
2.4 生成器函数
例子1
import time
def genrator_fun1():
    a = 1
    print(‘现在定义了a变量‘)
    yield a
    b = 2
    print(‘现在又定义了b变量‘)
    yield b
 
g1 = genrator_fun1()
print(‘g1: ‘,g1) #g1:  <generator object genrator_fun1 at 0x0000023859EE03B8>
print(next(g1))#1
time.sleep(1)   #sleep一秒看清执行过程
print(next(g1))#2
 
例子2
def generator():
    print(123)
    content = yield 1
    print(‘=======‘,content)
    print(456)
    yield 2
    print(‘=======‘,content)
 
g = generator()
ret = g.__next__()
print(‘***‘,ret)
ret = g.send(‘hello‘)   #send的效果和next一样
print(‘***‘,ret)
运行结果:
123
*** 1
======= hello
456
*** 2
 
3.列表推导式

l = [i for i in range(10)]

print(l)

#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

l1 = [‘选项%s‘%i for i in range(10)]

print(l1)

#[‘选项0‘, ‘选项1‘, ‘选项2‘, ‘选项3‘, ‘选项4‘, ‘选项5‘, ‘选项6‘, ‘选项7‘, ‘选项8‘, ‘选项9‘]

4.内置函数,匿名函数

4.1内置函数

什么是内置函数?就是Python给你提供的,拿来直接用的函数,比如print,input等等。截止到python版本3.6.2,现在python一共为我们提供了68个内置函数。


 内置函数


abs()


dict()


help()


min()


setattr()


all()


dir()


hex()


next()


slice()


any()


divmod()


id()


object()


sorted()


ascii()


enumerate()


input()


oct()


staticmethod()


bin()


eval()


int()


open()


str()


bool()


exec()


isinstance()


ord()


sum()


bytearray()


filter()


issubclass()


pow()


super()


bytes()


float()


iter()


print()


tuple()


callable()


format()


len()


property()


type()


chr()


frozenset()


list()


range()


vars()


classmethod()


getattr()


locals()


repr()


zip()


compile()


globals()


map()


reversed()


__import__()


complex()


hasattr()


max()


round()


delattr()


hash()


memoryview()


set()

常用的内置函数:

  1. eval: 执行字符串类型的代码,并返回最终结果。

eval(‘2 + 2‘)  # 4

n=81

eval("n + 4")  # 85

eval(‘print(666)‘)  # 666

  1. exec:执行字符串类型的代码。

s = ‘‘‘

for i in [1,2,3]:

print(i)

‘‘‘

exec(s)

#输出结果:

1

2

3

  1. 基础数据类型

float:函数用于将整数和字符串转换成浮点数。

进制转换(3):

    bin:将十进制转换成二进制并返回。

    oct:将十进制转化成八进制字符串并返回。

    hex:将十进制转化成十六进制字符串并返回。

print(bin(10),type(bin(10)))  # 0b1010 <class ‘str‘>

print(oct(10),type(oct(10)))  # 0o12 <class ‘str‘>

print(hex(10),type(hex(10)))  # 0xa <class ‘str‘>

  1. 数学运算

divmod:计算除数与被除数的结果,返回一个包含商和余数的元组(a
// b, a % b)。常用于网页页数显示。

sum:对可迭代对象进行求和计算(可设置初始值)。

min:返回可迭代对象的最小值(可加key,key为函数名,通过函数的规则,返回最小值)。

max:返回可迭代对象的最大值(可加key,key为函数名,通过函数的规则,返回最大值)。

# all 
可迭代对象中,全都是True才是True

# any 
可迭代对象中,有一个True 就是True

# print(all([1,2,True,0]))

# print(any([1,‘‘,0]))

map:会根据提供的函数对指定序列做映射。

         def square(x) :            # 计算平方数
                 return x ** 2

map(square, [1,2,3,4,5])   # 计算列表各个元素的平方

[1, 4, 9, 16, 25]

map(lambda x: x ** 2, [1, 2, 3, 4, 5])  # 使用 lambda 匿名函数

[1, 4, 9, 16, 25]

4.2   匿名函数

为了解决那些功能很简单的需求而设计的一句话函数。

#这段代码

def calc(n):

return n**n

print(calc(10))

#换成匿名函数

calc = lambda n:n**n

print(calc(10))



原文地址:https://www.cnblogs.com/junyingwang/p/9155543.html

时间: 2024-08-07 05:44:12

day-5 装饰器 迭代器 生成器的相关文章

函数嵌套 ,名称空间与作用域 ,闭包函数 ,装饰器 ,迭代器, 生成器 三元表达式,列表解析,生成器表达式 递归与二分法, 内置函数

函数嵌套名称空间与作用域闭包函数装饰器迭代器生成器三元表达式,列表解析,生成器表达式递归与二分法内置函数--------------------------------------------函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数def max(x,y): if x>y: return x else: return ydef max1(a,b,c,d): res=max(a,b) res2=max(res,c) res3=ma

python_day04 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式

本节课重要知识点内容如下: 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式 1.函数嵌套 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数 def bar(): print('from nbar')def foo(): print('from foo') bar()foo()def max2(x,y): if x > y: return x else: return ydef max4(a,

&lt;04day&gt;_函数嵌套--闭包函数--装饰器--迭代器--生成器

一.函数的嵌套定义 1.python函数支持嵌套 def f1(): #f1函数的定义 def f2(): #f2函数的定义 print('from f2') def f3(): #f3函数的定义 print('from f3') f2() f1() 嵌套函数--运行结果说明: 1首先调用f1()结果,f1函数为空.担保函f2函数,f2函数有内容打印并且有调用,f2函数包含f3函数,但f3函数无调用. 运行结果: 列子:多个数据之间的大小比较. #!/usr/bin/python # -*- c

函数+装饰器+迭代器+生成器

闭包函数 闭包:定义在内网函数,包含对外部作用域而非全局作用域 范围:一个函数套用1或n个函数 from urllib.request import urlopen #urlopen模块 作用:爬网页 #闭包函数,内部get函数调用外部page函数 def page(url): #调用url def get(): #下载 return urlopen(url).read() #爬网页 return get #返回url值 baidu=page("http://www.baidu.com"

day4装饰器-迭代器&amp;&amp;生成器

一.装饰器 定义:本质是函数,(装饰其他函数)就是为其它函数添加附加功能 原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 实现装饰器知识储备: 1.函数及“变量” 2.高阶函数 a.把一个函数名当做实参传给另一个函数(在不修改被装饰器函数源代码的情况下为其添加新功能) b.返回值中包含函数名 3.嵌套函数 高阶函数+嵌套函数 = 装饰器 延迟3秒 import time def test1(): time.sleep(3) print('in the test1')

python第四天装饰器+迭代器+生成器

1.函数嵌套:在调用一个函数的过程中,调用了其他函数 def f1(): x=1 def f2(): print('from f2') f2() f1()  2.名称空间与作用域 a. 名称空间:存放名字与变量值绑定关系的地方 (1)内置名称空间:在python解释器启动时产生,存放一些python内置的名字 (2)全局名称空间:在执行文件时产生,存放文件级别定义的名字. (3)局部名称空间:在执行过程中,如果调用了该函数则会产生该函数的局部名称空间.在调用该函数的时候生效,调用结束时失效 加载

Day4 装饰器——迭代器——生成器

一 装饰器 1.1 函数对象 一 函数是第一类对象,即函数可以当作数据传递 #1 可以被引用 #2 可以当作参数传递 #3 返回值可以是函数 #3 可以当作容器类型的元素 二 利用该特性,优雅的取代多分支的if def foo(): print('foo') def bar(): print('bar') dic={ 'foo':foo, 'bar':bar, } while True: choice=input('>>: ').strip() if choice in dic: dic[ch

Python学习---装饰器/迭代器/生成器的学习【all】

Python学习---装饰器的学习1210 Python学习---生成器的学习1210 Python学习---迭代器学习1210 原文地址:https://www.cnblogs.com/ftl1012/p/9484145.html

python_装饰器——迭代器——生成器

一.装饰器 1.什么是装饰器? 器=>工具,装饰=>增加功能 1.不修改源代码 2.不修改调用方式 装饰器是在遵循1和2原则的基础上为被装饰对象增加功能的工具 2.实现无参装饰器 1.无参装饰器的模板 def outter(func): def wrapper(*args,**kwargs): res=func(*args,**kwargs) return res return wrapper 2.使用:在被装饰对象正上方单独一行 @无参装饰器名 def foo(): pass 3.实现有参装