Python-函数其他(学习笔记4)
2017-11-20 16:21
330 查看
Python-函数其他
切片
对于list和tuple来说,可能有事需要获得他们的子串,而Java等都提供了类似subString()的方法来获取子串,而对于Python来说则有一种方法叫 切片
例如:
L = ['michel','Sarah','Bob','Tom']
想要获取L的前2个元素怎么办?
当然也可以使用
for循环,但是这样太麻烦了。
>>>L[0:3] ['michel','Sarah','Bob']
这样既可获得前2个元素,
L[0:3]表示从下标
0开始(包括
0),
3结束(不包括
3)。
如果是从
0开始的话,
0可以省略,即
L[:3]
因为下标
-1可以访问最后一个元素,所以负数的下标也是可以的。
但是必须是第一个下标小于第二个下标,(包括第一个下标,不包括第二个下标)并且为正序输出的
>>>L[-3:-1] ['michel','Sarah']
L[-3:-1]表示取
L中的倒数第三个(包括)到倒数第一个(不包括)
迭代
就是遍历List或者tuple,在Java中多是for来完成的
在Python中,使用
for...in,它可以用在list,tuple,dict等上,例如在dict上:
>>>dic = {'x':1,'y':2,'z':3} >>.for key in dic ··· print(key) ··· x y z
dict默认迭代的是key,如果迭代value,
for value in dic.values(),都遍历使用
for key,value in d.items()
注意:dict内的顺序不一定,遍历多次的结果可能不一致
如何检查一个对象是不是可迭代对象呢?
通过collections模块的Iterable类型
>>>from collections import Iterable >>>isinstance('abc',Interable) True
列表生成式
用来快速生成list,例如要生成1*1,2*2,3*3,4*4,5*5,6*6,我们怎么做?可以使用循环,但是过于麻烦
还可以使用
>>> l = [x * x for x in range(1,7) ] >>> l [1, 4, 9, 16, 25, 36]
for循环之后还可以加上
if表达式,来筛选某些数
>>> l = [x * x for x in range(1,7) if x % 2 == 0] >>> l [4, 16, 36]
还可以使用两层循环来生成全排列
>>> l = [m + n for m in 'xyz' for n in 'abc'] >>> l ['xa', 'xb', 'xc', 'ya', 'yb', 'yc', 'za', 'zb', 'zc']
也可以利用一些方法来改变大小写
>>> l = ['Abc','Def','Ghi'] >>> [s.lower() for s in l] ['abc', 'def', 'ghi']
生成器
通过列表生成器我们可以生成一个list,但是收到内存限制,列表的大小肯定会有限制。Python中有一个机制能够节省空间,条件是这个列表中的元素能够能够按照某种算法推导出来,然后只在使用的过程中推断出要使用的后序的元素,这被称为
generator
创建
generator的方法很多,第一种: 只需要把列表生成式中的
[]改为
()
>>> L = [x * x for x in range(10)] >>> L [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> g = (x * x for x in range(10)) >>> g <generator object <genexpr> at 0x000002253945DAF0>
我们可以直接答应
list里面的全部元素,但是我们要怎么打印
generator里的元素呢?
使用
next()来访问下一个元素,当到最后一个元素之后没有更多元素时,会答应
StopIteration错误
>>> next(g) 0 >>> next(g) 1 >>> next(g) 4 >>> next(g) 9 >>> next(g) 16 >>> next(g) 25 >>> next(g) 36 >>> next(g) 49 >>> next(g) 64 >>> next(g) 81 >>> next(g) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration
当然一直调用
next()多余麻烦,也可以使用
for循环
>>> g = (x * x for x in range(10)) >>> for n in g: ... print(n) ... 0 1 4 9 16 25 36 49 64 81
在原教程中的斐波那契数列的例子中,
def fib(max): n, a, b = 0, 0, 1 while n < max: print(b) a, b = b, a + b n = n + 1 return 'done'
提到了一个语句:
a, b = b, a + b
这个语句的实际执行相当于:
t = (b, a + b) # t是一个tuple a = t[0] #即a = b b = t[1] #b = a + b !但是此时的a并没有赋值为b!!!!
关于以上的这个斐波那契数列函数,实际上也是一个一个一个推算的函数,对于这个函数,其实也可以变成
generator的,只需要将
print(b)改为
yield b就可以。
如果一个函数定义中包含
yield关键字,那么这个函数就不再是一个普通函数,而是一个
generator:
这里问题就在于
generator函数的执行:在每次执行
next()的时候执行一次,遇到
yield就返回,下一次在上次返回的
yield的位置继续执行,例如:
def odd(): print('step 1') yield 1 print('step 2') yield(3) print('step 3') yield(5
在调用时要先生成一个
odd函数,在调用next()
>>> o = odd() >>> next(o) step 1 1 >>> next(o) step 2 3
当然还可以用
for。
迭代器
以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以被next()函数调用并不断返回下一个值的对象称为迭代器:
Iterator。
凡是可作用于
for循环的对象都是
Iterable类型;
凡是可作用于
next()函数的对象都是
Iterator类型,它们表示一个惰性计算的序列;
集合数据类型如
list、
dict、
str等是
Iterable但不是
Iterator,不过可以通过
iter()函数获得一个
Iterator对象。
Python的
for循环本质上就是通过不断调用
next()函数实现的
相关文章推荐
- Python3.3 学习笔记4 - 函数 - 内置和其他一些函数
- python学习笔记-(7)函数
- python的函数学习笔记
- Python3.3 学习笔记8 - 函数
- Python学习笔记(七)函数的使用
- python学习笔记3.4-函数装饰器
- Python学习笔记11—函数
- python函数学习笔记
- 简明Python教程学习笔记_2_函数
- python学习笔记3-函数
- python 学习笔记---函数式编程之高阶函数
- python学习笔记三之函数(基础篇)
- python 学习笔记 函数和类
- Python学习笔记(三)函数、面向对象、模块发布
- python学习笔记 函数
- Python学习笔记—函数
- python学习笔记(五)函数
- python学习笔记:第七天(函数)
- python学习笔记(九)将函数存储在模块中,导入模块
- python学习笔记7-函数返回值