python:高级特性

1、迭代(Iteration)

for … in … 遍历

2、列表生成式

>>>print([x*x for x in range(1,11)])
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> print([m+n for m in "asd" for n in "zxc"])
['az', 'ax', 'ac', 'sz', 'sx', 'sc', 'dz', 'dx', 'dc']
if … else … 用法
>>> print([x for x in range(1,11) if x%2==0])
[2, 4, 6, 8, 10]
>>> print([x for x in range(1,11) if x%2==0 else -x]
SyntaxError: invalid syntax

>>> print([x if x%2==0 else -x for x in range(1,11)])
[-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]
>>> print([x if x%2==0 for x in range(1,11)])
SyntaxError: invalid syntax

观察上方代码会发现,for前的if后面必须加else,for后的if不能加else。因为在列表生成式中for前的部分是一个表达式,需要给出一个明确的值,而for后的if只是一个过滤条件,所以不能加else。

3、生成器(generator)

定义生成器:

将列表生成式的[] 换成()即变成一个生成器,使用next调用。

>>> g=(x for x in range(6))
>>>> print(g)
<generator object <genexpr> at 0x000001F9D18E2660>
>>> next(g)
0
>>> next(g)
1
>>> next(g)
2
>>> for i in g:
	print(i)
3
4
5

next取出元素后就将该元素删除了,所以for循环只输出了3,4,5。通过上面的代码可以看出next很鸡肋,及其不方便,所以通常来说我们都用for循环遍历生成器。

定义生成器函数:

函数中包含yield
returnyield的区别在于,程序运行过程中遇到return就返回值,程序终止,而运行过程中遇到yield后返回,再次调用时从yield后继续执行。

>>> def odd():
    print('step 1')
    yield 1
    print('step 2')
    yield(3)
    print('step 3')
    yield(5)
>>> o=odd()
>>> next(o)
step 1
1
>>> next(o)
step 2
3
>>> next(o)
step 3
5
>>> next(o)
Traceback (most recent call last):
  File "<pyshell#50>", line 1, in <module>
    next(o)
StopIteration
try:
    a=testGen()
    print(next(a))
    print(next(a))
    print(next(a))
    print(next(a))      # 函数里已经没有 会出现异常
    print(next(a))
except StopIteration as si:   # 怎么知道会报什么异常  异常的基类  Exception
    print(si)   # 打印了return over

注意:在使用next时要注意后面括号里是函数,还是函数的调用(个人理解函数是test(),而函数的调用是a=test()
括号里是函数的情况,每次都是运行第一个yield前的内容,都是一样的:
在这里插入图片描述
括号里是函数的调用的情况,十分正确:
在这里插入图片描述

3、可迭代对象(Iterable)

第一类:list,dist,tuple,str,set等集合数据类型
第二类:生成器函数、生成器
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象:

>>>isinstance((x for x in range(2)),Iterable)
True

NameError: name ‘Iterable’ is not defined 报错解决方案入下:

from collections import Iterable

在这里插入图片描述

4、迭代器(Iterator)

可以被next不断调用返回下一个值的对象被称为迭代器。
生成器是迭代器,但list,tuple等是可迭代对象,却不是迭代器。可以把迭代器看为一个源源不断的数据流,起初并不知道长度。

异常处理
except [错误类型] as [自定义名称]print([自定义名称])

以上结构是为了可以输出错误类型,如下所示:

在这里插入图片描述

有帮助的话,点个赞再走吧~
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值