python笔记(二)一些特别语法
2017-08-24 13:15
225 查看
pyhton中有几个高级特性,也可以说语法糖。这些特性可以减少我们在一些场景中特殊操作的代码量。
而在python中提供了指定索引范围的操作
比如
还可以设置隔几个取一个元素
python中的切片操作可以大大的方便我们提取序列中的元素,生成新的额序列,一行代码就替换了很多的循环,不仅如此还可以对字符串和元组使用切片操作。
这个in就比较有意思了,只要是可以循环访问的对象,都可以使用for来进行迭代操作。
python中可以使用
使用前需要先导入一个Iterable模块
同时python的for可以使用两个参数来同时迭代下标索引和元素本身
最后补充
默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()。
如要生成一个从0到10的列表
只需要一行话就可以生成了,而且可读性还很高
还可以使用if语句来细化生成的规则
如下:
还有可以用来生成全排列
下面我写个三种循环生成1 2 3 的三个数字的全排列
更多的,还可以进行过滤操作
但有的时候我们只希望定义生成规则,而不希望一次性全部生成的操作呢,python也提供了一种叫生成器的特性,可以实现一边循环一边计算。
生成一个生成器的方法,就是把一个列表生成式的
这样l1就是一个生成器了
我们可以使用循环来调用这个生成器来获得每一次的运算结果,而且结果是迭代的
生成器中保存的运算规则,也可以说保存的是一个算法,也就是说我们也可以使用一个函数编写生成器。
但是呢函数不具有生成器那种迭代演算的性质。pytho中提供了一个
这使得含有yield关键字的函数变成一个生成器。
这里引用一下廖雪峰教程的斐波拉契数列的例子:
当调用fib()时,运行到
处继续执行,而不是重新在函数入口处执行。这样就可以达到了生成器的功能,一边迭代一边运算。每次调用fib()遇到
最后贴上个人写的打印杨辉三角的程序
当生成器无法输出时,会抛出一个
具体来说可以使用
真要记的话,也可以看这个对象能不能用
参考资料:廖雪峰python教程
切片操作(指定范围内的索引访问)
平时在C++中如果我需要访问一个序列中某个范围内的数组,一般是避免不了用循环的。而在python中提供了指定索引范围的操作
比如
R=[1,2,3,4,5] #遍历可以使用下面的方法 R[0:5] #>>[1,2,3,4,5] #代表的意思是取前5个元素,从下标0开始取,一直到5,但不包括5。 #如果了解C++中的STL的话,可以关联起来理解,上述方法对于区间操作是前闭后开的
还可以设置隔几个取一个元素
R=[1,2,3,4,5] #遍历可以使用下面的方法 R[0:5:2] #>>[1,3,5] #代表的意思是取前5个元素,隔一个元素输出一个 #如果了解C++中的STL的话,可以关联起来理解,上述方法对于区间操作是前闭后开的
python中的切片操作可以大大的方便我们提取序列中的元素,生成新的额序列,一行代码就替换了很多的循环,不仅如此还可以对字符串和元组使用切片操作。
迭代操作(抽象程度很高的循环)
python中的循环使用的是for ... in ...的结构
这个in就比较有意思了,只要是可以循环访问的对象,都可以使用for来进行迭代操作。
python中可以使用
isinstance()函数来判断一个函数是否可以进行迭代操作。
使用前需要先导入一个Iterable模块
from collections import Iterable r = [1,2,3,4,5] print(isinstance(r,Iterable)) #输出:True
同时python的for可以使用两个参数来同时迭代下标索引和元素本身
r = ['A','B','C','D','E'] for i,value in r: print(i,value) #输出 0 A 1 B 2 C 3 D 4 E
最后补充
默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()。
列表生成式
这个特性非常有意思,我们可以来编写语句来生成列表如要生成一个从0到10的列表
[x for x in range(11)]
只需要一行话就可以生成了,而且可读性还很高
还可以使用if语句来细化生成的规则
如下:
[x * x for x in range(1, 11) if x % 2 == 0] [4, 16, 36, 64, 100]
还有可以用来生成全排列
下面我写个三种循环生成1 2 3 的三个数字的全排列
print([m+n+k for m in '123' for n in '123' for k in '123' if m!=n and n!=k and m!=k])
更多的,还可以进行过滤操作
L1 = ['Hello', 'World', 18, 'Apple', None] print([x for x in L1 if isinstance(x,str)]) #输出:['Hello', 'World', 'Apple']
生成器(规则)
上面说到的列表生成式,一旦执行就会生成一个完整的符合生成式规则的列表但有的时候我们只希望定义生成规则,而不希望一次性全部生成的操作呢,python也提供了一种叫生成器的特性,可以实现一边循环一边计算。
生成一个生成器的方法,就是把一个列表生成式的
[]换成
()
l1=(x * x for x in range(1, 11) if x % 2 == 0])
这样l1就是一个生成器了
我们可以使用循环来调用这个生成器来获得每一次的运算结果,而且结果是迭代的
l1=(x * x for x in range(1, 11) if x % 2 == 0]) for n in l1: print(n)
生成器中保存的运算规则,也可以说保存的是一个算法,也就是说我们也可以使用一个函数编写生成器。
但是呢函数不具有生成器那种迭代演算的性质。pytho中提供了一个
yield关键字
这使得含有yield关键字的函数变成一个生成器。
这里引用一下廖雪峰教程的斐波拉契数列的例子:
def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 return 'done'
当调用fib()时,运行到
yield会返回,当下一次调用的时候会继续在
yield
处继续执行,而不是重新在函数入口处执行。这样就可以达到了生成器的功能,一边迭代一边运算。每次调用fib()遇到
yield都会中断返回,再次执行又会继续在上一次
yield处往下执行
最后贴上个人写的打印杨辉三角的程序
def triangles(): a=[1] while True: yield a a.append(0)#加多个0,下面的运算才不会溢出 a=[a[x]+a[x-1] for x in range(len(a))] n=0 for t in triangles(): print(t) n = n+1 if n==10: break
当生成器无法输出时,会抛出一个
StopIteration错误,我们可以使用异常来接收这个错误。
迭代器
最后这个特性,个人觉得只需要理解清除Iterator对象和
Iterable对象的区别及对应的类型就好。
具体来说可以使用
isinstance(对象,Iterable)函数判断就可以了,其实也不需要特别的去记。
真要记的话,也可以看这个对象能不能用
next()函数调用不断返回下一个值,可以的就是
Iterator对象,对应的就是上面所说的生成器。
参考资料:廖雪峰python教程
相关文章推荐
- Python一些特别的语法
- Python基础 语法特别注意笔记(和Java相比)
- Python基础 语法特别注意笔记(和Java相比)
- Python一些特别的语法(四)
- Python一些特别的语法(二)
- Python一些特别的语法(三)
- 【学习笔记】python的基础语法
- python个人笔记(一)基础语法
- Python语法笔记
- Python学习笔记——语法基础
- Python基础语法笔记
- 学习python的一些笔记
- 阅读源码遇到的一些Python 函数(--小白笔记)
- 关于python的一些笔记 2018-03-01 00:04:54
- Python学习笔记——Python开发中基本的语法1
- Python学习笔记1(基础语法)
- python学习笔记----基本语法代码过手1
- python基础教程_学习笔记14:标准库:一些最爱——re
- Python开发技术详解-笔记_第02章-基本语法
- Python学习笔记:语法基础2