折叠

Python基础语法快速复习-高级特性

1、切片

取list或tuple的部分元素

L = ['Chen','Yu','Long','Murasamelory']

L[0:3]
['Chen', 'Yu', 'Long']

切片取元素时,按照给定范围采取左闭右开的方式取元素。

支持倒数切片

print(L[-2:])
print(L[-2:-1])
['Long', 'Murasamelory']
['Long']

按照步长切片

#快速创建列表
L = list(range(100))
#步长切片
L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]

特殊:字符串'xxx'可以看作为一种list,每个元素是一个字符,可以对字符串进行切片操作。

"ABCDEFG"[:3]
'ABC'

2、迭代

使用for循环遍历的过程叫做迭代。

python中迭代通过for...in来完成

python的for循环可以作用于所有可迭代对象上,无论有无下标,都可以迭代。

#迭代字典的key
d = {'a':1,'b':2,'c':3}
for key in d:
    print(key)
print('='*10)
#迭代字典的value
for value in d.values():
    print(value)
print('='*10)
#同时迭代字典的key和value
for k,v in d.items():
    print(k,v)
a
b
c
==========
1
2
3
==========
a 1
b 2
c 3

判断对象是否可迭代,采用collections模块中的Iterable类型判断

from collections import Iterable
print(isinstance('abc',Iterable))
print(isinstance([1,2,3],Iterable))
print(isinstance(123,Iterable))
True
True
False


<ipython-input-5-47569b4f962c>:1: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.9 it will stop working
  from collections import Iterable

实现下标循环:采用python内置enumerate函数将list变为索引-元素队,采用同时迭代的方法取出索引和元素本身

for i,value in enumerate(['A','B','C']):
    print(i,value)
0 A
1 B
2 C

3、列表生成式

快速生成[1x1, 2x2, 3x3, ..., 10x10]

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

在for循环后加上if判断筛选出仅偶数的平方。

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

两层循环的全排列

[m+n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

列出当前目录下的所有文件和目录名

import os
[d for d in os.listdir('.')]
['.ipynb_checkpoints', '函数.ipynb', '高级特性.ipynb']

使用两个变量生成list

d = {'x':'A','y':'B','z':'C'}
[k+'='+v for k,v in d.items()]
['x=A', 'y=B', 'z=C']
[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。

3、生成器

生成器(generator):可以在循环的过程中不断推算出后续元素,这样就不需要创建完整的list,节省大量空间。

#列表生成式
L = [x*x for x in range(10)]
print(L)
#生成器创建
g = (x*x for x in range(10))
print(g)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
<generator object <genexpr> at 0x000002AFC437A2E0>

遍历生成器的方法是采用for循环,因为生成器是可迭代对象。

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)

a = t[0]

b = t[1]

fib(6)
1
1
2
3
5
8





'done'

采用生成器写出斐波拉契数列函数

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(6)
<generator object fib at 0x000002AFC487E6D0>

用next()执行generator对象时候,遇到yield语句就会返回,再次执行从上次返回的yield向后执行

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

4、迭代器

直接作用于for循环的数据类型有以下几种:

(1)集合数据类型,如list、tuple、dict、set、str等

(2)生成器(generator)

以上都是可迭代对象(Iterable)。

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

可以使用isinstance()判断一个对象是否为迭代器。

生成器都是迭代器对象,但list、dict、str是可迭代对象而非迭代器

将list、dict、str变为迭代器使用iter()函数

from collections.abc import Iterator
print(isinstance(iter([]), Iterator))
print(isinstance(iter('abc'), Iterator))
True
True
posted @ 2021-03-13 19:18  Coverpast  阅读(74)  评论(0编辑  收藏  举报