python高级特性

在这里插入图片描述

一、生成式详解

1.列表生成式

列表生成式就是一个用来生成列表的特定语法形式的表达式。是Python提供的一种生成列表的简洁形式, 可快速生成一个新的list。
普通的语法格式:[exp for iter_var in iterable]
带过滤功能语法格式: [exp for iter_var in iterable if_exp]
循环嵌套语法格式: [exp for iter_var_A in iterable_A for iter_var_B in iterable_B]

# 需求:生成100个验证码(4个字母组成的验证码)
import string
import random
codes = []                                                                               
for count in range(100):
    code = "".join(random.sample(string.ascii_letters,4))
    codes.append(code)
print(codes)
# 列表生成式
codes = ["".join(random.sample(string.ascii_letters,4)) for i in range(100)]
print(codes)

在这里插入图片描述
示例:

# 需求:找出1-100之间可以被3整除的数
nums = []
for num in range(1,101):
    if num % 3 == 0:
        nums.append(num)
print(nums)
# 列表生成式
nums = [num for num in range(1,101) if num %3 == 0]
print(nums)

代码运行结果:
在这里插入图片描述

2.字典生成式

# 字典生成式
result = {i: i**2 for i in range(10)}
print(result)

代码运行结果:
在这里插入图片描述

3.集合生成式

# 集合生成式
result = {i**2 for  i in range(10)}
print(result)

代码运行结果:
在这里插入图片描述

二、生成器详解

1.什么叫生成器?

 在Python中,一边循环一边计算的机制,称为生成器:Generator。
  • 什么时候需要使用生成器?
    性能限制需要用到,比如读取一个10G的文件,如果一次性将10G的文件加载到内存处理的话(read方法),内存肯定会溢出;但使用生成器把读写交叉处理进行,比如使用(readline和readlines)就可以再循环读取的同时不断处理,这样就可以节省大量的内存空间.

2.如何创建生成器?

  • 第一种方法: 列表生成式的改写。 []改成()
nums = (i**2 for i in range(10))
for num in nums:
    print(num)

代码运行结果:
在这里插入图片描述

  • 第二种方法: yield关键字。

如何打印生成器的每一个元素呢?

  • 通过for循环, 依次计算并生成每一个元素。
  • 如果要一个一个打印出来,可以通过next()函数获得生成器的下一个返回值。
# return: 遇到return就返回,后面代码不会执行
# yield: 遇到yield停止执行代码,再次调用next方法时,会从上次停止的地方继续执行,遇到yiekd继续
def login():
    print('step 1') 
    yield 1
    print('step 2')
    yield 2
    print('step 3')
    yield 3
# 如果函数里面有yield关键字,函数的返回值就是一个生成器
g = login()
print(next(g))
print(next(g))
print(next(g))

代码运行结果:
在这里插入图片描述

3.生成式的特点

解耦. 爬虫与数据存储解耦;
减少内存占用. 随时生产, 即时消费, 不用堆积在内存当中;
可不终止调用. 写上循环, 即可循环接收数据, 对在循环之前定义的变量, 可重复使用;
生成器的循环, 在 yield 处中断, 没那么占 cpu.

三、闭包

什么是闭包?如何实现闭包?
闭包就是指有权访问另一个函数作用域中的变量的函数。
创建闭包最常见方式,就是在一个函数内部创建另一个函数。
常见形式: 内部函数使用了外部函数的临时变量,且外部函数的返回值是内部函数的引用。
闭包的一个常用场景就是装饰器。

# import  time
# start_time = time.time()  # 时间戳:从1970年1.1到现在经历的秒数
# time.sleep(2)
# end_time = time.time()    # 时间戳:从1970年1.1到现在经历的秒数
# print(end_time-start_time)



# 闭包:
#   1. 函数里面嵌套函数
#   2. 外部函数的返回值是内部函数的引用
#   3. 内部函数可以使用外部函数的变量
def timeit(name):
    def wrapper():
        print('wrapper ' + name)
    print('timeit')
    return wrapper

in_fun = timeit(name='westos')  # wrapper函数, in_fun实质上就是wrapper函数
in_fun()

代码运行结果:
在这里插入图片描述

四、装饰器

1.什么是装饰器

器指的是工具,而程序中的函数就是具备某一功能的工具,所以装饰器指的是为被装饰器对象添加额外功能的工具/函数。

2.为什么要使用装饰器

如果我们已经上线了一个项目,我们需要修改某一个方法,但是我们不想修改方法的使用方法,这个时候可以使用装饰器。因为软件的维护应该遵循开放封闭原则,即软件一旦上线运行后,软件的维护对修改源代码是封闭的,对扩展功能指的是开放的。
装饰器的实现必须遵循两大原则:
封闭: 对已经实现的功能代码块封闭。 不修改被装饰对象的源代码
开放: 对扩展开发
装饰器其实就是在遵循以上两个原则的前提下为被装饰对象添加新功能。

# 1.装饰器:用来装饰函数的工具
# 2.功能:在不改变源代码的情况下,添加的额外功能(eg:计算运行时间)
# 3.如何实现装饰器,基于闭包
import time
def timeit(f):      # f=add
    def wrapper(x, y):
        start = time.time()
        result = f(x, y)   # f实质上是add函数
        end = time.time()
        print("函数运行的时间为: %.4f" %(end-start))
        return  result
    return wrapper

@timeit   # 1. 语法糖, add=timeit(add)
def add(x, y):
    return x + y

result = add(1, 3)
print(result)

代码运行结果:
在这里插入图片描述

3.万能装饰器的实现

装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。

"""
装饰器的万能模板:
def 装饰器名称(f):
    @wraps(f)  # 保留被装饰函数的属性信息和帮助文档
    def wrapper(*args, **kwargs):
        # 执行函数之前做的事情
        result = f(*args, **kwargs)
        # 执行函数之后做的事情
        return  result
    return  wrapper
"""

# 需求: 计算函数的运行时间
import  time
from functools import  wraps
def timeit(f):
    """计时器的装饰器"""
    @wraps(f)  # 保留被装饰函数的属性信息和帮助文档
    def wrapper(*args, **kwargs):
        """wrapper内部函数"""
        start = time.time()
        result = f(*args, **kwargs)
        end = time.time()
        print(f"函数{f.__name__}运行时间为{end-start}秒")
        return  result
    return  wrapper

@timeit
def login():
    """login desc"""
    print('login....')

@timeit
def crawl():
    import  requests
    url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Python.svg/1200px-Python.svg.png'
    content = requests.get(url).content
    with open('doc/python.png', 'wb') as f:
        f.write(content)
        print("下载图片成功")

# print(help(login))
# login()
crawl()

代码运行结果:
在这里插入图片描述
在这里插入图片描述

4.含参数的装饰器

套三层的装饰器;在装饰器外层嵌套一层

# 需求: 计算函数的运行时间
import  time
from functools import  wraps
def timeit(args='seconds'):
    def desc(f):
        """计时器的装饰器"""
        @wraps(f)  # 保留被装饰函数的属性信息和帮助文档
        def wrapper(*args, **kwargs):
            """wrapper内部函数"""
            start = time.time()
            result = f(*args, **kwargs)
            end = time.time()
            if args == 'seconds':
                print(f"函数{f.__name__}运行时间为{end-start}秒")
            elif args == 'minutes':
                print(f"函数{f.__name__}运行时间为{(end-start)/60}秒")
            return  result
        return  wrapper
    return  desc

@timeit(args='minutes')  # timeit()  @desc===> login=desc(login)
def login():
    """login desc"""
    print('login....')

@timeit
def crawl():
    import  requests
    url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Python.svg/1200px-Python.svg.png'
    content = requests.get(url).content
    with open('doc/python.png', 'wb') as f:
        f.write(content)
        print("下载图片成功")

# print(help(login))
# login()
crawl()

5.多个装饰器

from functools import  wraps
def is_login(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        print('is_login, 用户是否登录')
        result = f(*args, **kwargs)
        return  result
    return  wrapper

def is_permission(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        print('is_permission, 用户是否有权限')
        result = f(*args, **kwargs)
        return  result
    return  wrapper

# 规则: 执行装饰器内容是从上到下。 被装饰的顺序是从下到上。
@is_login
@is_permission
def show_hosts():
    print("显示所有的云主机")


show_hosts()

在这里插入图片描述

五、内置高阶函数

# 1. map函数
result = map(lambda x: x ** 2, [1, 2, 4, 5])
print(list(result))
result = map(lambda x, y: x + y, [1, 2, 3], [4, 5, 6])
print(list(result))
# 2. reduce函数
from functools import reduce

# (((1+2)+3)+4)+5=reduce result
result = reduce(lambda x, y: x + y, [1, 2, 3, 4, 5])
print(result)

# 练习: 求1*2*..100的结果, 用reduce和匿名函数实现

# 3. filter:
# 筛选所有的偶数
result = filter(lambda x: x % 2 == 0, [1, 2, 4, 5, 8])
print(list(result))
# 筛选所有的奇数
result = filter(lambda x: x % 2 != 0, [1, 2, 4, 5, 8])
print(list(result))

# 4. sorted:
result = sorted([1, 29, 2, 3])
print(result)
result = sorted([0, 29, 2, 0], reverse=True)
print(result)
result = sorted([0, 8, 9, 0, 16], key=lambda x:0 if x==0 else 1)
print(result)
# reverse: 排序规则,True 降序 ,False 升序(默认)
result = sorted([0, 29, 2, 0], reverse=True)
print(result)  #[29, 2, 0, 0]

# key: 主要是用来进行比较的元素,只有一个参数
result = sorted([0, 8, 9, 0, 16], key=lambda x:0 if x==0 else 1)
print(result)  #[0, 0, 8, 9, 16]

在这里插入图片描述

python排序sort()和sorted()的区别

1.排序对象不同: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
2.返回值不同:
(1)list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,
(2)内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python高级特性是指一些内置函数的高级用法,可以帮助我们更方便地完成一些功能。以下是一些常见的Python高级特性的介绍和示例: 1. 列表推导式(List Comprehension):通过简洁的语法创建新的列表。可以在一个列表中根据条件筛选元素、对元素进行操作等。例如: ```python # 创建一个包含1到10的平方的列表 squares = [x**2 for x in range(1, 11)] print(squares) # 输出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100] ``` 2. 字典推导式(Dictionary Comprehension):类似于列表推导式,可以用简洁的语法创建新的字典。例如: ```python # 创建一个包含1到10的平方的字典 squares_dict = {x: x**2 for x in range(1, 11)} print(squares_dict) # 输出:{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100} ``` 3. 生成器表达式(Generator Expression):类似于列表推导式,但是返回一个生成器对象,可以逐个生成值,而不是一次性生成所有值。例如: ```python # 创建一个生成器,逐个生成1到10的平方 squares_gen = (x**2 for x in range(1, 11)) print(next(squares_gen)) # 输出:1 print(next(squares_gen)) # 输出:4 # ... ``` 4. 匿名函数(Lambda Function):一种简洁的函数定义方式,通常用于需要一个简单函数的地方。例如: ```python # 定义一个匿名函数,计算两个数的和 add = lambda x, y: x + y print(add(3, 5)) # 输出:8 ``` 5. 高阶函数(Higher-order Function):可以接受函数作为参数或返回函数的函数。例如,`map()`函数可以将一个函数应用到一个可迭代对象的每个元素上。例如: ```python # 将函数应用到列表的每个元素上 numbers = [1, 2, 3, 4, 5] squared_numbers = list(map(lambda x: x**2, numbers)) print(squared_numbers) # 输出:[1, 4, 9, 16, 25] ``` 这些是Python的一些常见高级特性,它们可以帮助我们更加简洁和高效地编写代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值