PYTHON专题-(6)python基础的一些高级特性

embedded/2024/11/17 3:52:20/

什么是切片?

  • 取一个list或tuple的部分元素。

什么是迭代?

  • 如果给定一个listtuple,我们可以通过for循环来遍历这个listtuple,这种遍历我们称为迭代(Iteration)。在Python中,迭代是通过for ... in来完成的。

什么是列表生成式?

  • 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
    python">L = [x * x for x in range(10)]

什么是生成器?

  • 在Python中,一边循环一边计算的机制,称为生成器:generator。生成器会根据需要逐个产生值,而不会一次性生成所有结果。这样可以提高效率,并减少内存消耗。
  • 如果要一个一个打印出来,可以通过next()函数获得generator的下一个返回值。 注意:生成器对象在迭代完成后再次调用 next() 函数会引发 StopIteration 异常,可以使用 try/except 块来捕获该异常。
  • 也可以使用for循环,因为generator也是可迭代对象。

怎么创建生成器?

  • 创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator:
    >>> g = (x * x for x in range(10))
    >>> g
    <generator object <genexpr> at 0x1022ef630>
  • 要创建一个生成器,也可以使用函数来定义。生成器函数和普通函数的区别在于它使用 yield 语句来产生一个值,而不是使用 return 语句。生成器函数会返回一个生成器对象,这个对象可以用于迭代。例如,定义一个生成器函数,可以使用关键字 def 来定义函数,并在函数体内使用 yield 语句产生一个值。
    python">def my_generator():yield 1yield 2yield 3
    
  • 然后通过调用生成器函数,可以将生成器函数赋值给一个变量,这个变量会成为一个生成器对象。例如:
    python">my_gen = my_generator()
    
  • 接下来就使用生成器对象进行迭代。可以使用 for 循环来迭代生成器对象中的值,或者使用 next() 函数来逐个获取生成器对象中的值。例如:
    python">for value in my_gen:print(value)# 或者使用 next() 函数
    print(next(my_gen))
    print(next(my_gen))
    print(next(my_gen))
    

什么是可迭代对象:Iterable?

  • 可迭代对象(Iterable)是指可以被迭代的对象,也就是可以通过循环访问其元素的对象。在Python中,可迭代对象是一种抽象的数据类型,它定义了一个__iter__方法,该方法返回一个迭代器(Iterator)对象。通过调用迭代器对象的__next__方法,可以逐个访问可迭代对象的元素。
  • 常见的可迭代对象包括列表(list)、元组(tuple)、字符串(string)、字典(dict)、集合(set)等。此外,还可以通过自定义类实现可迭代对象,只需要在类中定义__iter__方法并返回一个迭代器对象即可。
  • 通过使用可迭代对象和迭代器,可以更方便地对数据进行遍历和处理,而无需显式的使用循环结构。

什么是迭代器Iterator?

  • 迭代器是用于遍历集合或序列的对象。它是一种数据访问模式,通过迭代器可以一次访问集合中的每个元素,而不需要了解集合的底层实现方式。
  • 迭代器提供了一种统一的接口,使得可以以相同的方式遍历不同类型的集合。通过调用迭代器的next()方法,可以逐个返回集合中的元素,当没有元素可返回时,迭代器会抛出StopIteration异常。迭代器可以用于for循环、列表推导式和生成器等地方。

 怎么构建迭代器?

  • 构建一个迭代器可以通过定义一个类,并实现 __iter____next__ 方法来实现。例如:
    python">class MyIterator:def __init__(self, data):self.data = dataself.index = 0def __iter__(self):return selfdef __next__(self):if self.index < len(self.data):value = self.data[self.index]self.index += 1return valueelse:raise StopIteration# 使用迭代器遍历列表
    my_list = [1, 2, 3, 4, 5]
    my_iterator = MyIterator(my_list)for item in my_iterator:print(item)
    
  • 在上面的示例中,MyIterator 类实现了 __iter____next__ 方法。__iter__ 方法返回了迭代器对象自身,而 __next__ 方法返回迭代器中下一个元素。当没有元素时,__next__ 方法会引发 StopIteration 异常,这告诉迭代器已经遍历完所有的元素。

函数可以做参数吗? 

  • 可以,函数也可以作为参数传递给其他函数。这种能力被称为高阶函数(Higher-order functions)。当函数作为参数传递给其他函数时,可以让代码更加灵活和可复用。例如,可以通过将一个比较函数作为参数来定制排序的方式。
    python">def compare_by_length(str1, str2):return len(str1) - len(str2)def sort_strings(strings, compare_func):return sorted(strings, key=compare_func)strings = ['apple', 'banana', 'cherry', 'date']
    sorted_strings = sort_strings(strings, compare_by_length)
    print(sorted_strings)
    
  • 在这个例子中,compare_by_length 函数接受两个字符串参数,并返回它们长度的差值。sort_strings 函数接受一个字符串列表和一个比较函数作为参数,然后使用 sorted 函数进行排序,根据比较函数来决定元素的顺序。
  • 在这里,我们使用了 compare_by_length 函数作为比较函数,以便按照字符串的长度进行排序。输出结果将会是 ['date', 'apple', 'cherry', 'banana'],因为按照字符串长度从短到长的顺序排序了字符串列表。

函数作为结果值返回吗?

  • 可以!在Python中,函数可以作为结果值返回。这是因为在Python中,函数被视为一种对象,可以像任何其他对象一样进行操作和传递。因此,可以在一个函数中定义另一个函数,并将其作为结果返回。这种功能在编写高阶函数(Higher-order functions)和函数式编程中非常有用。

什么是函数闭包? 

  • 函数闭包是指在函数内部定义的函数,该函数可以访问并修改外部函数的变量,并且这些变量的生命周期会超过外部函数的执行。在函数闭包中,内部函数可以引用外部函数的变量,即使外部函数已经执行完毕,内部函数仍然可以访问和修改外部函数的变量。这是因为在函数闭包中,外部函数的变量被保存在内部函数的环境中,该环境被称为闭包。
  • 闭包可以实现一些高级功能,如函数工厂和装饰器。

什么是函数工厂? 

  • 函数工厂是一种设计模式,它是一个用来创建函数的函数。它接受一些参数,并根据这些参数动态地生成并返回一个新的函数。
  • 函数工厂的目的是通过参数化创建函数,以便在需要时能够根据不同的需求生成不同的函数。这种方式可以增加代码的灵活性和可重用性。通过使用函数工厂,我们可以避免编写多个相似的函数,而只需要提供不同的参数即可生成需要的函数。

怎么实现函数工厂? 

  • 在Python中实现函数工厂可以使用闭包的概念。闭包是一个包含了被定义函数的环境的函数对象,它允许被定义的函数访问并操作闭包环境中的变量。下面是一个示例代码,演示了如何使用函数工厂创建一个计算平方和立方的函数:
    python">def create_power_function(power):def power_function(x):return x ** powerreturn power_functionsquare = create_power_function(2)
    cube = create_power_function(3)print(square(2))  # 输出:4
    print(cube(2))    # 输出:8
    
  • 在这个例子中,create_power_function是一个函数工厂,它接受一个参数power,并返回一个计算乘方的函数power_function。通过调用create_power_function,可以创建不同幂次的计算函数。在这个例子中则是分别创建了平方函数和立方函数。
  • 需要注意的是,在闭包中,每个函数power_function都有自己的power变量的副本。这意味着可以同时创建多个power_function,每个函数有各自的power值,而不会互相影响。

什么是装饰器Decorator? 

  • 在Python中,函数装饰器是一种特殊的函数,用于修改其他函数的行为。它们是通过将被装饰的函数作为参数传递给装饰器函数,并将其替换为返回的新函数来实现的。本质上,decorator就是一个返回函数的高阶函数。
  • 函数装饰器可以用于许多用途,例如添加日志记录、计时器、验证等功能,而无需修改原始函数的代码。装饰器可以在不影响函数调用方式的情况下,对函数进行额外的操作。使用装饰器可以提高代码的可重用性和可维护性,同时使代码更加简洁和优雅。

怎么实现装饰器?

  • 在Python中,装饰器是一种特殊的函数,它可以用来修改其他函数的功能。实现装饰器的基本步骤如下:
  1. 定义一个装饰器函数,其参数为被装饰的函数(或类)。
  2. 在装饰器函数内部,定义一个内部函数,用于包裹原始函数,并添加额外的功能。
  3. 在内部函数中,调用原始函数,并返回其结果。
  4. 将内部函数作为装饰器函数的返回值。
  • 以下是一个简单的装饰器示例,用于计算函数执行的时间:
    python">import timedef calculate_time(func):def wrapper(*args, **kwargs):start_time = time.time()result = func(*args, **kwargs)end_time = time.time()execution_time = end_time - start_timeprint(f"函数执行时间:{execution_time}秒")return resultreturn wrapper@calculate_time
    def my_function():time.sleep(2)my_function()
    
  • 输出结果为:
    函数执行时间:2.0000739097595215秒
    
  • 在上面的示例中,calculate_time是装饰器函数,它接受一个被装饰的函数作为参数。wrapper是装饰器函数内部定义的包裹函数,它记录函数的执行时间并返回结果。@calculate_time语法将装饰器应用到了my_function函数上,使得调用my_function时会自动执行装饰器函数的逻辑。

 什么是functools.wraps?

  • functools.wraps 是一个装饰器,用于将被装饰函数的元数据复制到装饰函数中,以便在使用装饰器后仍然可以访问原始函数的名称、文档字符串和参数签名等信息。
  • 当使用装饰器来装饰一个函数时,通常会改变原始函数的属性,例如其名称和文档字符串。这可能会导致在调试代码或生成文档时出现问题。为了解决这个问题,functools.wraps 函数提供了一种简单的方式来复制原始函数的属性。
  • 使用 @functools.wraps 装饰器,可以确保装饰器函数具有与原始函数相同的名称、文档字符串和参数签名。这样可以保留原始函数的元数据,使得在调试或生成文档时更容易理解和使用被装饰函数。例如:
    python">import functoolsdef my_decorator(func):@functools.wraps(func)def wrapper(*args, **kwargs):# 执行装饰器逻辑return func(*args, **kwargs)return wrapper@my_decorator
    def my_function():"""这是一个被装饰函数"""passprint(my_function.__name__)  # 输出 "my_function"
    print(my_function.__doc__)   # 输出 "这是一个被装饰函数"
    
  • 在上面的示例中,my_decorator 是一个装饰器函数,它将 functools.wraps 应用到 wrapper 函数上。这样,wrapper 函数将拥有与被装饰的 my_function 函数相同的名称和文档字符串。

http://www.ppmy.cn/embedded/90840.html

相关文章

前端:Vue学习 - 智慧商城项目

前端&#xff1a;Vue学习 - 智慧商城项目 1. vue组件库 > vant-ui2. postcss插件 > vw 适配3. 路由配置4. 登录页面静态布局4.1 封装axios实例访问验证码接口4.2 vant 组件 > 轻提示4.3 短信验证倒计时4.4 登录功能4.5 响应拦截器 > 统一处理错误4.6 登录权证信息存…

nginx负载均衡、java、tomcat装包

一、nginx 七层负载均衡 1、七层负载均衡基础配置 2、负载均衡状态 [rootserver]# vim /usr/local/nginx/conf/nginx.confworker_processes 1;event {worker_connections 1024&#xff1b;}http { # 七层负载均衡支持http、ftp协议include mime.types;default_type app…

pytest测试框架之http协议接口测试

1 接口测试 日常测试中接口测试是一项重要的工作&#xff0c;尤其是http协议的接口测试更加普遍,比如一些常用的测试框架或者工具&#xff08;robotframework框架&#xff0c;testng框架&#xff0c;postman等&#xff09;都支持http接口的测试&#xff0c;而这节内容主要介绍…

C语言宠物系统

功能有增加宠物信息&#xff0c;显示宠物信息&#xff0c;删除宠物信息&#xff0c;修改功能和排序功能&#xff0c;可以选择姓名排序&#xff0c;年龄排序&#xff0c;价格排序。进阶的功能有文件操作&#xff0c;动态内存开辟。。 test.c源文件 #include "Pet.h"v…

「C++系列」指针

文章目录 一、指针的定义二、指针的基本概念1. 基本概念2. 案例代码示例 1&#xff1a;基本指针使用示例 2&#xff1a;指针与数组 3. 注意事项 三、指针的用途1. 指针的用途2. 案例代码案例1. 动态内存分配案例2. 函数参数&#xff08;通过指针修改值&#xff09;案例3. 数组和…

docker环境下php安装扩展步骤 以mysqli为例

docker环境下php安装扩展步骤 以mysqli为例 1.0 前言2.0 php 扩展安装原理3.0 docker 环境下 php 扩展安装3.1 docker php 容器扩展安装路径及原理3.2 docker php 扩展脚本安装过程 同步发布在个人笔记[docker环境下php安装扩展步骤 以mysqli为例]( https://blog.lichenrobo.co…

C# 类型转换

隐式&#xff08;implicit&#xff09;类型转换 1.不丢失精度的转换 2.显示&#xff08;explicit&#xff09;类型的转换 有可能丢失精度的转换 使用convert转换 ToString方法&#xff1a;将数值类型转换成字符串型

git将自己工作分支多次提交合并为一次提交到主分支

首先&#xff0c;你需要确认你当前的分支和主分支的状态&#xff0c;确保所有的改动都已经commit。然后切换到主分支&#xff1a; git checkout 主分支名 然后&#xff0c;使用git merge --squash命令将你的开发分支的改动合并到主分支&#xff1a; git merge --squash 开发…