python(2) - 切片、迭代器、生成器、函数

mac2022-06-30  86

python 基础知识

继上一篇【python基础】

说明:

参考系列加入官网系列文档:python 3.7各部分代码都是写到同一文件中的second.py声明的变量是公用的。

上一篇主要是入门,如果你学习过其他编程语言,基本动手操作一遍就了解了。

高级特性

切片 获取部分数据(类似slice)的操作方法。 说明:

基础语法表示[start:end],start其实位置,end结束位置(不包含);接受负数(-1),从最后一个元素开始。默认start为0 ,默认end为数据长度(length)[start:end:sep] 表示间隔sep取一个值; # [:] 生成10个有序数列 names = list(range(11)) print(names[1:6]) # [::] print(names[1:6:2])

迭代 for...in对数据进行迭代操作; 说明:

通过collections.abc模块导入Iterable类型isinstance判断数据类型是否同给定的类型相同,返回bool。通过内置函数enumerate把list转为索引-元素对。 # 判断当前数据是否可以进行迭代 from collections.abc import Iterable # output True print(isinstance(names,Iterable)) # enumerate names = enumerate(names) for k,v in names: print(k,v)

列表生成式 快速生成数据。[]表达式里进行操作; 说明:

依次for循环取得变量。 # [] 简易表达式 nums = [n*n for n in [2,4,8]] print(nums) # 多层操作 nums = [n*m for n in [2,4,8] for m in [1,3,6]] print(nums)

生成器 生成器函数可以用来生成数据,利用它的特性不需要把所有数据都列出来,减少数据占据的空间。 说明:

()创建一个生成器;next()用来获取元素,获取到最后一个元素时,再次获取就会报错StopIteration;在普通函数中使用yield关键字,成为一个生成器函数; # generator names=(n*n for n in [2,4,8]) for val in names: print("for-",val) # for 循环已经输出了所有值,在调用next() 报错 print(next(names))

迭代器 迭代对象Iterator表示的是数据流,只能通过next()方法才能访问到下一个值;基本数据类型list/dict/set是可迭代数据,但不是迭代对象。 说明

isinstance()判断是否为迭代对象。通过使用iter()函数将可迭代数据转换为迭代对象;生成器可用于生成无限大的数据流。 # 判断当前数据类型是否为迭代对象 from collections.abc import Iterator # False print(isinstance(nums,Iterator)) # True print(isinstance(names,Iterator)) # using iter() output: True print(isinstance(iter(nums),Iterator))

函数

学习是建立在有前端基础的情况下,一些类似于JS的语法、语义不会在重复书写,只记录不同之处。

匿名函数 说明

lambda表示匿名函数, # 匿名函数 total = lambda val:val*3 # 12 print(total(4))

装饰器 在代码运行期间,动态增加功能的方式,称之为装饰器

说明

__name__属性返回函数定义的名称@表示需要额外执行的函数名称,会自动调用。装饰器接受当前函数作为参数,用于回调执行。@functools.warps() 用于复制原始函数属性到返回函数上,比如实例中的wrapper函数,导致__name__变为了wrapper, # 装饰器 @+函数名称 def log(fn): def wrapper(*arg,**oth): print("------操作--------",fn.__name__,"---------操作用户名称---------",arg[0]) return fn(*arg,**oth) return wrapper @log def login(user): print("欢迎登陆:"+user) # ------操作-------- login ---------操作用户名称--------- admin # 欢迎登陆:admin login("admin") # 装饰器函数掺入自定义参数 import functools def log(bool): def decorator(fn): @functools.wraps(fn) def wrapper(*arg,**oth): print("------操作--------",fn.__name__,"---------操作用户名称---------",arg[0]) if bool: print("2019-10-06") return fn(*arg,**oth) return wrapper return decorator @log(True) def login(user): print("欢迎登陆:"+user) # ------操作-------- login ---------操作用户名称--------- test # 2019-10-06 # 欢迎登陆:test login("test")

偏函数 利用functools.partial()可以设置已定义函数的默认值参数。

说明

针对公用函数进行设置,各模块需要传递各自标识,以进行不同处理操作。functools.partial()第二个参数如果没有指定参数名,如flag=False,则默认将参数放到arg[0]第一个。 # 设定函数默认值 def info(name,flag = True): adorn = "" if flag: adorn = "尊贵的" print("欢迎"+adorn+"客人:",name) info("admin",False) info("test",False) # 通过 functools.partial() 设置处理 ,无需每次传递参数 flag info_ = functools.partial(info,flag=False) info_("admin") info_("test")

模块

按功能进行划分以及每个人对自己写的模块进行包装。防止命名冲突

说明

from...import... 导入某个模块中的方法或者变量import... 导入整个模块,使用调用以目录为package包,必须包含__init__.py文件,可为空,

包目录示例:

# 模块使用 # 从模块文件中导入某个方法或者变量 from logs.info import print_log # 导入整个模块 user.info 使用时调用获取 import user.info print_log() print(user.info._Author_)

正则表达式

re模块包含了所有正则表达式的功能。

说明

由于字符串自身\的转义,在使用时使用r""re.match() 匹配到时返回match对象re.split() 第一个参数提供正则表达式,分割字符串 , 数据类型为listgroup()获取匹配到的结果只,group(0)永远是原始字符串。groups() 返回匹配到的结果值(元组)re.compile()使用预编译正则表达式,在后续使用过程中,程序不会再进行编译 # re 模块 正则表达式 import re # 匹配任意字符一次或多次 + 'lo' print(re.match(r".+lo","hello")) # 匹配 'l' 一次或多次进行分割 print(re.split(r"l+","hello")) # groups ('h', 'lo') print(re.match(r"^([a-z]+)el([a-z]+)$","hello").groups()) # 对表达式及进行编译, reg_ = re.compile(r"\d+\+\d+"); print(reg.match("2233+123").group(1))

附所有模块执行结果:

最新回复(0)