函数进阶

有参装饰器

def login_auth(func):    
    def wrapper(func):        
        def inner(*args, **kwargs):            
            res = func(*args, **kwargs)            
            return res        
        return inner    
    return wrapper
@login_auth('vip用户')
def index():    
    pass

无参装饰器

def wrapper(func):    
    def inner(*args,**kwargs):        
        res = func(*args, **kwargs)        
        return res    
    return inner
@wrapper
def index():    
    pass

生成器

生成器的本质:yield生成器是自定义的迭代器,本质是迭代器

生成器的定义:在函数体自定义yield,调用函数时函数体内代码不会执行,当通过__next__()取值时才会执行函数体内代码,并且yield会返回一个结果(可以返回多次);

yield的特点: 1.yield只能在函数体内定义 2.每次都往生成器添加一个值 3.可以保持暂停状态

yield和return的区别:

相同点:都有返回值

不同点:return只能返回一次值(一次值可以是空,一个,多个),yield一次只能返回一个值,但可以返回多次。

演练
list1 = [1, 2, 3, 4] 
list = list1.__iter__() 
print(list.__next__())
通过__next__()取值才会执行函数体内代码
def func():
    print('from func')
    yield 'tank'
    print(func().__next__())
def func():
    yield 1
    yield 2
    yield 3
    yield 4
    yield 5
    yield 6
res = func()
__next__()直接通过func()取值,只能取第一个,必须通过func()对象res才能实现迭代全部
print(res.__next__())
......
print(res.__next__())
迭代器内部自动优化stopiteration报错
def range_me(start, end, move=1):
    while start < end:#         
        yield start#         
        start += move# 
res = range_me(1,5)
for line in res:     
    print(line)
    for line in range_me(1,5,1):  
        print(line)

面向过程编程

面向过程编程自白:面向过程编程核心是’过程’二字,类似工厂流水线,即先做什么后做什么。

优点: 复杂的问题流程化、简单化。

缺点: 可扩展性差,牵一发而动全身。

def get_user_pwd():    
    while True:        
        username = input('请输入用户名:').strip()        
        if username.isalpha():            
            break        
        else:            
            print('名字不合法')    
    while True:        
        password = input('请输入密码').strip()        
        re_password = input('请确认密码').strip()        
        if password == re_password:            
            break        
        else:            
            print('两次密码不一致')    
     return username, password

def cut_user_pwd(user,pwd):    
    user_pwd_str = f'{user}:{pwd}
'    
    return user_pwd_str

def save_data(user_pwd_str):    
    with open('user.txt','a',encoding='utf8') as f:        
        f.write(user_pwd_str)
def register():    
    user,pwd = get_user_pwd()    
     user_pwd_str = cut_user_pwd(user,pwd)    
     save_data(user_pwd_str)
register()

三元表达式

将if…else分支变成一行

语法:条件成立if返回左边的值,else不成立返回右边的值。

num1 = 10
num2 = 20 
res = num1 if num1 > num2 else num2
print(res)

def max1(num1,num2):     
    res = num1 if num1 < num2 else num2
    return res
res = max1(10,20)
print(res)

username = input('请输入用户名:').strip()
new_username = username if username == 'lipeng' else username+'dsb'
print(new_username)

列表生成式

list = [值 for 可迭代对象中取出的每一个值 in 可迭代对象]

优点:可以依赖索引取值,取值方便

缺点:浪费资源

普通方式
list = [1,2,3,4]
new_lsit = []
for line in list:
    new_lsit.append(line)
    print(new_lsit)
列表生成式
list1 = [f'{line}' for line in range(1,23)]
print(list1)
list1 = ['nick','tank','seaon']
list = [ line + 'dsb' for line in list1]
print(list)

生成器表达式

优点:节省资源

缺点:取值不方便

#为了节省空间连打印都不给显示了
g = (line for line in range(1,1000))
print(next(g))
结果:<generator object <genexpr> at 0x000001839FDB0E08>

匿名函数

没有名字的函数,左边是参数,右边是返回值lambda:1

因为没有名字,所以没有调用方法;

匿名函数需要一次性使用,和内置函数更配哦。(单身狗是可耻的)

内置函数

range()、print()、len()等都是属于内置函数python内部提供的内置方法

max, min, sorted, map, filter

sorted 对可迭代对象进行排序 后面加reverse=true进行倒序排列

我把月亮戳到天上 天就是我的 我把脚踩入地里 地就是我的 我亲吻你 你就是我的
原文地址:https://www.cnblogs.com/zhulipeng-1998/p/12863914.html