数据之路 Day5 - Python基础5
1.迭代
通过for
循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)
# 遍历字符串 for x in 'hello':print(x)# 遍历列表 lt = [1, 2, 3] for i in lt:# 手动获取下标print(i, lt.index(i))# 遍历列表,可以直接使用下标 for index, value in enumerate(lt):print(index, value)# 遍历字典 d = {'a': 'apple', 'b': 'banana', 'c': 'cat', 'd': 'dog'} for k in d:# 默认遍历的是键,值需要单独获取print(k, d[k])for k,v in info.items():print('%s is %s'%(k,v))# for k, v in d.items(): # 上下两个式子等价 for k, v in dict.items(d):print(k, v)
2.列表生成式
例1:生成[1x1, 2x2, 3x3, ..., 10x10]# 方法一:循环 L = [] for x in range(1, 11):L.append(x * x)# 方法二:列表生成式 [x * x for x in range(1, 11)]>>>[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]例2for + if 判断 [x * x for x in range(1, 11) if x % 2 == 0]>>>[4, 16, 36, 64, 100]例3 使用两层循环,可以生成全排列: [m + n for m in 'ABC' for n in 'XYZ']>>>['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']例4 for循环对dict的items()可以同时迭代key和value: d = {'x': 'A', 'y': 'B', 'z': 'C' } for k, v in d.items():print(k, '=', v)>>> y = Bx = Az = C列表生成式,使用两个变量来生成list: d = {'x': 'A', 'y': 'B', 'z': 'C' } [k + '=' + v for k, v in d.items()]>>> ['y=B', 'x=A', 'z=C']把一个list中所有的字符串变成小写: L = ['Hello', 'World', 'IBM', 'Apple'] [s.lower() for s in L]>>> ['hello', 'world', 'ibm', 'apple']
3.生成器
Python中,一边循环一边计算的机制,称为生成器:generator
generator创建:
# 方法一:将一个列表生成式的[]改成() L = [x * x for x in range(10)] # 列表生成式 g = (x * x for x in range(10)) # 生成器 generator的下一个返回值,通过next()函数获得 generator保存的是算法,每次调用next(g),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误为避免StopIteration的错误 g = (x * x for x in range(10)) for n in g:print(n)# 方法二 def fib(max):n, a, b = 0, 0, 1while n < max:print(b)a, b = b, a + b # 赋值语句n = n + 1return 'done'斐波拉契数列的推算规则,逻辑类似generator 要把fib函数变成generator,只需要把print(b)改为yield b def fib(max):n, a, b = 0, 0, 1while n < max:yield ba, b = b, a + bn = n + 1return 'done'
generator和函数的执行流程不一样。
函数是顺序执行,遇到return语句或者最后一行函数语句就返回。
generator,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。 循环过程中不断调用yield,就会不断中断,
因此需要要给循环设置一个条件来退出循环,否则会产生一个无限数列。
for循环调用generator时,发现拿不到generator的return语句的返回值。 如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中。
g = fib(6) while True:try:x = next(g)print('g:', x)except StopIteration as e:print('Generator return value:', e.value)break>>> g: 1g: 1g: 2g: 3g: 5g: 8Generator return value: done
4.迭代器
可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
。
凡是可作用于for
循环的对象都是Iterable
类型;
凡是可作用于next()
函数的对象都是Iterator
类型,它们表示一个惰性计算的序列;
集合数据类型如list
、dict
、str
等是Iterable
但不是Iterator
,不过可以通过iter()
函数获得一个Iterator
对象。
Python的for循环本质上就是通过不断调用next()函数实现: for x in [1, 2, 3, 4, 5]:pass实际上完全等价于:# 首先获得Iterator对象: it = iter([1, 2, 3, 4, 5]) # 循环: while True:try:# 获得下一个值:x = next(it)except StopIteration:# 遇到StopIteration就退出循环break
5.装饰器
# -*- coding:gbk -*- '''示例1: 使用语法糖@来装饰函数,相当于“myfunc = deco(myfunc)” 但发现新函数只在第一次被调用,且原函数多调用了一次'''def deco(func):print("before myfunc() called.")func()print(" after myfunc() called.")return func@deco #@deco和myfunc = deco(myfunc)其实是完全等价的 def myfunc():print(" myfunc() called.")myfunc() myfunc()# 装饰器被调用 # -*- coding:gbk -*- '''示例2: 使用内嵌包装函数来确保每次新函数都被调用, 内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象'''def deco(func):def _deco():print("before myfunc() called.")func()print(" after myfunc() called.")# 不需要返回func,实际上应返回原函数的返回值return _deco@deco def myfunc():print(" myfunc() called.")return 'ok'myfunc() myfunc()# 对带参数的函数进行装饰 # -*- coding:gbk -*- '''示例5: 对带参数的函数进行装饰, 内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象'''def deco(func):def _deco(a, b):print("before myfunc() called.")ret = func(a, b)print(" after myfunc() called. result: %s" % ret)return retreturn _deco@deco def myfunc(a, b):print(" myfunc(%s,%s) called." % (a, b))return a + bmyfunc(1, 2) myfunc(3, 4)# 让装饰器带参数 # -*- coding:gbk -*- '''示例7: 在示例4的基础上,让装饰器带参数, 和上一示例相比在外层多了一层包装。 装饰函数名实际上应更有意义些'''def deco(arg):def _deco(func):def __deco():print("before %s called [%s]." % (func.__name__, arg))func()print(" after %s called [%s]." % (func.__name__, arg))return __decoreturn _deco@deco("mymodule") def myfunc():print(" myfunc() called.")@deco("module2") def myfunc2():print(" myfunc2() called.")myfunc() myfunc2()
转载于:https://www.cnblogs.com/Iceredtea/p/9691744.html
数据之路 Day5 - Python基础5相关推荐
- 数据之路 Day6 - Python基础6
一.模块路径及导入 模块路径 ===================================================================================== ...
- 大数据的python基础_大数据量化之路之python基础
一.计算机运行基本原理及python基础 在了解计算机运行基本原理之上,理解python程序运行基本原理.做好数据分析准备工作. 安装好Anaconda做好相应变量配置,下载cmd工具Conemu,利 ...
- 我的Python成长之路---第六天---Python基础(20)---2016年2月20日(晴)
一.面向对象基础 面向对象名词解释: 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公 ...
- 老男孩-Python之路,Day1 - Python基础1
本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...
- 我的Python成长之路---第六天---Python基础(18)---2016年2月20日(晴)
os模块 提供对操作系统进行调用的接口 >>> import os >>> os.getcwd() # 获取当前工作目录,类似linux的pwd命令 '/data/ ...
- 我的Python成长之路---第六天---Python基础(19)---2016年2月20日(晴)
shelve模块 shelve模块是pickle模块的扩展,可以通过key,value的方式访问pickle持久化保存的数据 持久化保存: 1 2 3 4 5 6 7 8 9 10 11 12 13 ...
- python之路-02 Python基础
变量声明及赋值 声明变量:name = "Alex Li" 上述代码声明了一个变量,变量名为: name,变量name的值为:"lanhan" #!Author ...
- python之路金角大王_Python 之路03 - Python基础3
本节内容 函数与函数式编程 函数式编程之参数详解 局部变量与全局变量作用域 嵌套函数 递归 函数式编程介绍 高阶函数 内置函数 1. 函数与函数式编程 1.面向对象:华山派--->类---> ...
- 老男孩-Python之路,Day2 - Python基础2
本节内容 列表.元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1. 列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作 定义列表 ...
最新文章
- 2020年,最适合AI的5种编程语言
- 曾经成功的敏捷团队为什么失败?
- Python学习系列day5-python基础
- Github Star 11.5K项目再发版:AAAI 2021 顶会论文开源,80+多语言模型全新升级
- 信息学奥赛一本通 1023:Hello,World!的大小 | OpenJudge NOI 1.2 10
- MaxKey单点登录认证系统 v2.4.0 RC
- Spring MVC学习总结(14)——SpringMVC测试框架之mockMVC详解
- Linux应用基本命令实验,实验二 linux基本命令的使用
- MongoDB工具MagicMongoDBTool使用介绍(一) -- 简单MongoDB入门
- python基础教程-学习python有什么好的视频教程?
- Kali渗透测试:使用Word宏病毒进行渗透攻击
- XJTU-SY滚动轴承加速寿命试验数据集
- Android 常用简单bat脚本
- 图片像素、大小、分辨率的关系
- Linux arm 支持 ntfs 文件系统
- pycharm异常问题之Unable to save settings: Failed to save settings. Please restart PyCharm
- 企业选择局域网即时通讯软件的必要性是什么?
- 群晖 NAS 与 百度云网盘互相进行同步
- 美格智能5G模组助力电力巡检之无人机产品智能化高效运作
- 2021-BUGKU-做题记录-WEB