python学习笔记--高级特性

切片slice

取列表/元祖前3个元素:列表取出为列表,元祖取出为元祖

L[0:3] 表示从索引 0 到 3(第1个到第3个元素),但不包括 3的元素

L[:] 表全部,可以省略,第一个省开头0,第二个省结尾len(L)+1

L[2:3] 表示 L[2]

L[10:20]11 到 20 个数

L[:1] 第一个数; L[1:] 除第一个数剩下所有

L[-1:] == L[len(L) - 1 : len(L) + 1] 最后一个数;
L[:-1] 除最后一个数所有的数

L[-10:] 最后10个数

L[:10:2] 前10个数每2个数取一个

L[::5] 每5个数取一个

字符串也可以

>>> a = 'abcdedf'
>>> a[::2]
'acef'

利用切片操作,实现一个trim()函数,去除字符串首尾的空格,注意不要调用str的strip()方法:

# ' h ', '  ', '',' h h '
def trim(s):
   if len(s) == 0:
       return s
    while s[:1] == ' ':
          s = s[1:]
    while s[-1:] == ' ':
          s = s[:-1]
    return s 

迭代iteration

可迭代类型皆可迭代,不止list列表,还有字典、元祖、集合、字符串

判断是否可迭代

from collections import Iterable

>>> isinstance(123,Iterable)
False
>>> isinstance(([1,2,3]),Iterable)
True

for n in L == 对 L 遍历一遍

字典迭代

d = {'a':1,'c':3,'b':4}
for key in d:    # 默认为关键字
    print(key)

for value in d.values():  #  对值用 d.values()
    print(value)

for k,v in d.items():  #  同时使用值和关键字 d.items()
    print(k,v)

字符串迭代

for s in 'abcd':
    print(s)
a
b
c
d

同时迭代 序号和元素

通过enumerate( )函数

for i,value in enumerate(['a','b','c']):
    print(i,value)
0 a
1 b
2 c

同时引入多个变量

for x,y in [(1,1),(2,2),(3,3)]:
    print(x,y)
1 1
2 2
3 3

列表生成器

语法:[ x+y for x in range(1,11) if x%2==0 for y in range(1,10) ]
使for循环后得到的所有表达式 以列表形式存入

>>> [x*x for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]


>>> [ x*x for x in range(1,11) if x%2 == 0 ]
[4, 16, 36, 64, 100]

>>> [n + m for n in 'abc' for m in 'ABC']   # 两层 for 全排列
['aA', 'aB', 'aC', 'bA', 'bB', 'bC', 'cA', 'cB', 'cC']

>>> import os # 导入os模块,模块的概念后面讲到
>>> [d for d in os.listdir('.')] # os.listdir可以列出文件和目录

for循环可以同时使用两个变量: 字典d.items()

>>> d = {'a':'A','b':'B','c':'C'}
>>> [ x + '-->' + y  for x,y in d.items()]

['a-->A', 'b-->B', 'c-->C']

使所有字符变小写

>>> L = ['J','Haa']
>>> [s.lower() for s in L]

['j', 'haa']

for前面使用if else

>>> [  x if x%2==0 else -x for x in range(1,11) ]

[-1, 2, -3, 4, -5, 6, -7, 8, -9, 10]

for 前 if else 为表达式,for 后 if 为过滤条件不带else

生成器generator

第一种定义 ( )

列表表达式直接生成完整的列表占空间使用[ ]
生成器根据算法生成,需要的时候生成需要多少生成多少,减少空间开销使用( )
g = (x*x for x in range(3))

for n in g:
    print(n)
0
1
4

互换

>>> a = 1
>>> b = 10
>>> a,b = b, a   # 直接换
>>> a
10
>>> b
1

>>> a,b = b, a+b  #  右边值a,b为替换前的 a,b值
>>> a
1
>>> b
11

第二种定义替换函数中printyield

def fib(max):
    n, a, b = 0,0,1
    while n < max:
        yield b   # 替换print
        a,b = b,a+b
        n += 1
    
f = fib(5)  # 此时 f 为生成器 而非函数
print(f)

for n in f:   # 常用输出形式
    print(n)
    
while True:    # 捕获异常,最后值的输出
    try:
        x = next(f)
        print(x)
    except StopIterator as e:
        print('Generator return value:',e.value)
        break
        
g: 1
g: 1
g: 2
g: 3
g: 5
g: 8
Generator return value: None

每次 yield 执行后返回,next() 从上次 yield 位置开始

def odd():
    print('step 1')
    yield 1
    print('step 2')
    yield 2
    print('step 3')
    yield(5)

o = odd()
next(o)   # 位置停在yield 1处
next(o)     # 位置停在yield 2处
next(o)       # 位置停在yield 5处

step 1
step 2
step 3
杨辉三角
def triangles():
    L = [1]
    while True:
        yield L
        L = [1] + [ L[i]+L[i+1] for i in range(len(L)-1) ] + [1]
n = 0
results = []
for t in triangles():
    results.append(t)
    n = n + 1
    if n == 10:
        break

for t in results:
    print(t)

迭代器

凡是可以 for 循环的都是 Iterable, 如 list,tuple,dict,strIterator

但是 list,tuple,dict,str 不是迭代器,可以通过 iter( list ) 变成迭代器

>>> from collections.abc import Iterator
>>> isinstance((x for x in range(10)), Iterator)
True
>>> isinstance([], Iterator)
False
>>> isinstance({}, Iterator)
False
>>> isinstance('abc', Iterator)
False

迭代器是通过 next() 不断调用,不断生成,而非直接生成存储所有数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值