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

python 基础知识

继上一篇【python基础】

说明:

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

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

高级特性

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

  • 基础语法表示[start:end]start其实位置,end结束位置(不包含);接受负数(-1),从最后一个元素开始。
  • 默认start0 ,默认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() 第一个参数提供正则表达式,分割字符串 , 数据类型为list
  • group()获取匹配到的结果只,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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

heroboyluck

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值