python3基础复习笔记二

1 set 集合
>>> s = set([1, 1, 2, 2, 3, 3])
>>> s
{1, 2, 3}
>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> s.remove(4)
>>> s
{1, 2, 3}
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4}

2. pass占符,可以让没有实现好的模块将代码运行起来
def nop():
    pass
3. 函数可以返回两个值,可以用两个变量来接收,也可以用一个变量来接收(元组)
import math

def move(x, y, step, angle=0):
    nx = x + step * math.cos(angle)
    ny = y - step * math.sin(angle)
    return nx, ny
    
>>> x, y = move(100, 100, 60, math.pi / 6)
>>> print(x, y)
151.96152422706632 70.0

>>> r = move(100, 100, 60, math.pi / 6)
>>> print(r)
(151.96152422706632, 70.0)
4. 用函数定义一个函数
import math
def quadratic(a, b, c):
    return lambda x: a*math.pow(x, 2) + b*x + c
5. 可变参数
def calc(*numbers):
    sum = 0
    for n in numbers:
        sum = sum + n * n
    return sum
    
>>> calc(1, 2, 3)
14
>>> calc(1, 3, 5, 7)
84   
*nums表示把nums这个list的所有元素作为可变参数传进去
>>> nums = [1, 2, 3]
>>> calc(*nums)
14
6. 关键字参数
def person(name, age, **kw):
    print('name:', name, 'age:', age, 'other:', kw)
    
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}

# 将一个字典以kw的形式传进去
>>> extra = {'city': 'Beijing', 'job': 'Engineer'}
>>> person('Jack', 24, **extra)
name: Jack age: 24 other: {'city': 'Beijing', 'job': 'Engineer'}

def f1(a, b, c=0, *args, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)

def f2(a, b, c=0, *, d, **kw):
    print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
    
>>> f1(1, 2, 3, 'a', 'b')
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
>>> f1(1, 2, 3, 'a', 'b', x=99)
a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
>>> f2(1, 2, d=99, ext=None)
a = 1 b = 2 c = 0 d = 99 kw = {'ext': None}

>>> args = (1, 2, 3, 4)
>>> kw = {'d': 99, 'x': '#'}
>>> f1(*args, **kw)
a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
>>> args = (1, 2, 3)
>>> kw = {'d': 88, 'x': '#'}
>>> f2(*args, **kw)
a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}
7. 迭代器
class Fib(object):
    def __init__(self):
        self.a = 0
        self.b = 1

    def __next__(self):
        self.a , self.b = self.b , self.a + self.b
        return self.a

    def __iter__(self):
        return self
8. 迭代(Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上)
for key in d   # 迭代key
for value in d.values()    # 迭代values
for k, v in d.items()      # 迭代key和values

# 判断是否可以迭代
>>> from collections import Iterable
>>> isinstance('abc', Iterable) # str是否可迭代
True
>>> isinstance([1,2,3], Iterable) # list是否可迭代
True
>>> isinstance(123, Iterable) # 整数是否可迭代
False

# enumerate可以将一个可迭代的对象搞成索引-元素对
for i, value in enumerate(['A', 'B', 'C'])

# 以元祖为单位遍历
>>> for x, y in [(1, 1), (2, 4), (3, 9)]:
9. 列表生成式--[]前面是式子描述生成规则,循环生成还可以加上限制条件
[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()]
>>> L = ['Hello', 'World', 'IBM', 'Apple']
>>> [s.lower() for s in L]

10. 生成器:generator,一边循环一边计算用于节约内存
  • 要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成()
  • 怎么打印出generator的每一个元素呢?通过next()函数获得generator的下一个返回值
>>> g = (x * x for x in range(10))
>>> g
 at 0x1022ef630>
>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g)
9
>>> next(g)
16
……



# 生成器可以用于迭代
>>> g = (x * x for x in range(10))
>>> for n in g:
...     print(n)

# 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'
11. yield与next
def odd():
    print('step 1')
    yield 1
    print('step 2')
    yield(3)
    print('step 3')
    yield(5)
    

>>> o = odd()
>>> next(o)
step 1
1
>>> next(o)
step 2
3
>>> next(o)
step 3
5
>>> next(o)
Traceback (most recent call last):
  File "", line 1, in 
StopIteration
12. 用生成器实现杨辉三角型
#encoding:utf-8
def triangles(n):
    res = [1]
    i = 0
    while i < n:
        yield res
        i = i + 1
        res_temp = [1]
        j = 0
        while j < len(res) -1 :
            res_temp.append(res[j] + res[j+1])
            j = j+1
        res_temp.append(1)
        res = res_temp
# 实现了生成器可以用for进行循环
for n in triangles(9):
    print n
# 也可以获取对象后,用next遍历
o = triangles(5)
print o
print next(o)
print next(o)
print next(o)
13. 迭代与生成器

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

  • 一类是集合数据类型,如list、tuple、dict、set、str等;
  • 一类是generator,包括生成器和带yield的generator function。
    这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
    可以使用isinstance()判断一个对象是否是Iterable对象

生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。

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

把list、dict、str等Iterable变成Iterator可以使用iter()函数

你可能感兴趣的:(python3基础复习笔记二)