|
Python |
PHP |
list切片 从索引a切到索引b,不包括b [a:b] 当a为0的时候可以省略[:b] 如果到最后:[a:] |
l = [1,2,3,4,5,6,7,8,9] s = l[0:3] print(s) 支持倒数切片: x = l[-2:] print(x) 最后一个数的索引可以写成-1 |
$l = [1,2,3,4,5,6,7,8,9]; $s = array_slice($l,0,3); print_r($s) 区别:Python是切索引到索引,PHP切索引后长度 |
list跳位切片(跳过num-1个数字取值) [a:b:num] a,b都不填的时候为全部 [:]原list [::num]原list跳位切片 |
l = [1,2,3,4,5,6,7,8,9] dump = l[::2] print(dump) |
|
tuple切片 tuple切片完之后还是一个tuple |
tuple = (1,2,3,4,5) print(tuple) print(tuple[0:3]) |
|
字符串切片 (可以看成类似list切片) |
str = "abcdefg" print(str[:3]) |
$str = "abcdefg"; echo substr($str,0,3); |
字符串首尾去空格 |
str.strip()
也可以利用递归自定义 def trim(s): if len(s) == 0: return '' else: if s[:1] == " ": return trim(s[1:]) if s[-1:] == " ": return trim(s[:-1]) return s |
trim($str) |
|
Python |
PHP |
迭代 (使用for遍历) 数值不能迭代 |
list、tuple、str for i in list: pass dict d = {'a': 1, 'b': 2, 'c': 3} for k in d: print(k) for v in d.values(): print(v) for k,v in d.items(): print(k,v) |
|
判断是否可以迭代 |
from collections import Iterable print(isinstance(d,Iterable)) |
|
list实现下标迭代 |
list = [1,2,3,4,5] for k,v in enumerate(list): print(k,v) |
|
特殊迭代 同时获取2个值 |
for x,y in [('a','b'),('c','d'),('e','f')]: print(x,y) |
|
|
Python |
PHP |
列表生成式 [生成式 for 参数 in 可迭代变量] |
简单列表生成:list(range(0,100))
生成一个[1,4,9…,100]列表 [x*x for x in range(1,11)] 循环后面可以跟判断 [x*x for x in range(1,11) if x%2 == 0] 双层循环组合列表生成 [m + n for m in 'ABC' for n in 'XYZ']
二参数获取生成式 d = {'x': 'A', 'y': 'B', 'z': 'C' } [k + '=' + v for k, v in d.items()]
小写 [s.lower() for s in L] |
|
打印文件夹中文件名列表 |
import os list = [d for d in os.listdir('.')] print(list) |
|
|
Python |
PHP |
生成器generator (边循环一边计算的机制) |
将列表生成式的[]换成()就可以生成一个简单的生成器
|
|
生成器的值获取 |
基本不用:next(generator) 常用: for i in generator: pass |
|
函数转换成生成器 print()改成yield()
生成器中return不再能够直接获取并打印,想要获取的话需要进行错误捕获 存在于StopIteration的value中
|
def fib(max): n,a,b = 0,0,1 while n<max: yield(b) a,b = b,a+b n = n+1 generator = fib(5) for i in generator: pass 当函数定义中包含yield关键字,就会变成生成器 |
|
杨辉三角 优化版本:使用列表生成式的方式 def triangles(n): |
def triangles(n): yield [1]#如果是第一排就只有[1] start = 1 while start < n: list = [1,1] start = start + 1 if start > 2: #大于2排的时候获得上一排数据 insert = triangles(start-1)#递归拿到含有上层数据的生成器 for i in insert: #循环出上一层的数据 if len(i) == start -1: num = 0 #前后两个数据相加的组合为长度-1 len = len(i) - 1 while len > 0: num = num + 1 len = len - 1 #每一个相加的组合插入一次到后面一层 list.insert(num, i[num-1] + i[num]) yield list |
|
|
Python |
PHP |
杨辉三角 生成式写法 |
def triangles(n): ls = [1] while n>0: yield ls ls = [1] + [ls[i] + ls[i + 1] for i in range(len(ls) - 1)] + [1] n = n - 1 |
|
迭代器 Iterator |
可迭代对象Iterable 可以直接使用for进行循环的数据格式包括 list、tuple、set、dict、str、generator 迭代器Iterator 能够被next()函数调用
注意:generator都是iterator list、tuple、set、dict、str虽然可迭代,但是不是迭代器 但是可以使用iter()函数进行格式转换 |
|