python入门学习篇十六(Introduction to Python Chapter 16)

迭代取值跟索引取值的对比

# 迭代取值提供了一种不依赖于索引取值的方式
s = 'hello'

迭代取值:
    1. 不依赖于索引取值,__next__()取值
    2. 不能重复取值,只能从左往右一个一个取值
索引取值:
    1. 必须要是一个容器类型
     2. 可以重复取值

生成器(自定义的迭代器)

# 生成器就是自定义的迭代器

def index():
    print('first')
    yield 123,234,345
    print('second')
    yield 'aaaa'
    print('third')
    yield 'xxxx'


# 函数里面有yield关键字之后,函数调用之前还是函数,一旦调用函数变成了生成器

res=index()  # 一旦是生成器,就可以__next__取值了
print(res.__next__())
# 函数中的yield关键字的玩法:__next__一下,走一个yield,光标就停在了yield
# 如果在__next__,会从上一次停留的yield位置继续往下走
print(res.__next__()) # StopIteration
print(res.__next__()) # StopIteration


# l = [1, 2, 3,]
# a= l.__iter__()
# while True:
#     print(a.__next__())

生成器实现range功能

# range功能:
1.玩法一:
range(10)  # 0-9的数字
2. 玩法二:
range(3,10)  # 3-9的数字
3. 玩法三:
range(1, 10, 2) # 1,3,5,7,9

# 玩法2:
def my_range(start, end=None, step=1):
    # start => 2
    # end => 10
    if not end:
        end = start
        start = 0

    while start < end:
        yield start
        start += step

#
# res = my_range(2, 10, 2)
res = my_range(10)

for i in res:
    print(i)

yield传值

def index(name):
    print('%s 准备干饭' % name)
    while True:
        food = yield
        print('%s 开干 %s' % (name, food))

res=index('ly')
res.__next__()
# res.__next__()

res.send('苹果')
res.send('橘子')

yield跟return的对比

yield:
    1. 函数内遇到yield关键字把函数变成了生成器
    2. yield 也可以返回值,并且支持返回多个(元组形式)
    3. 遇到yield,函数不会结束,而是"停住"
    4. yield 也支持传值
return 
    1. 后面可以跟返回值,也支持返回多个(元组形式)
    2. 函数遇到return,会立马结束

生成器的表达式

# 1. 生成器的笔试题
# 求和
def add(n, i):
    return n + i


# 调用之前是函数 调用之后是生成器
def test():
    for i in range(4):
        yield i


g = test()  # 初始化生成器对象
for n in [1, 10]:
    g = (add(n, i) for i in g)
    '''
        第一次循环:
            g = (add(1, i) for i in g)
        第二次循环:
            g = (add(10, i) for i in (add(10, i) for i in g))
    '''
res = list(g)
print(res)

常见的内置函数

# print(abs(123))
# print(abs(-123))  # 求绝对值

# l = [1, 2, 3, 4,5,6,7]
# print(all(l))
# print(any(l))
# print(sum(l)) # 求和

# print(divmod(100,10))
# print(divmod(101,10))
# print(divmod(99,10))

'''
    100条数据,10条  10
    101条数据,10条  11
    99条数据   10条  10
'''
# num,mod = divmod(100, 10)
# if not mod:
#     page = num+1


string = """
# hahahahh
print('hello world')
"""
# eval(string)
# exec(string)

# a = 123
# s = 'aaaa'
# print(type(a) is int)
# print(type(s) is str)
# print(isinstance(s, int))  # 判断某个数据是不是某个实例

# print(chr(68))
# print(ord('A'))

# print(pow(2,3))  # 2
# print(pow(3,3))  # 2
# print(round(4.3))
# print(round(4.5))
# print(round(4.8))

# bytes()
s = 'aaa'
print(s.encode('utf8'))
res=bytes(s, 'utf8')
print(res)
print(res.decode('utf8'))
print(str(res,'utf8'))
————————

Comparison between iterative value and index value

# 迭代取值提供了一种不依赖于索引取值的方式
s = 'hello'

迭代取值:
    1. 不依赖于索引取值,__next__()取值
    2. 不能重复取值,只能从左往右一个一个取值
索引取值:
    1. 必须要是一个容器类型
     2. 可以重复取值

Generator (custom iterator)

# 生成器就是自定义的迭代器

def index():
    print('first')
    yield 123,234,345
    print('second')
    yield 'aaaa'
    print('third')
    yield 'xxxx'


# 函数里面有yield关键字之后,函数调用之前还是函数,一旦调用函数变成了生成器

res=index()  # 一旦是生成器,就可以__next__取值了
print(res.__next__())
# 函数中的yield关键字的玩法:__next__一下,走一个yield,光标就停在了yield
# 如果在__next__,会从上一次停留的yield位置继续往下走
print(res.__next__()) # StopIteration
print(res.__next__()) # StopIteration


# l = [1, 2, 3,]
# a= l.__iter__()
# while True:
#     print(a.__next__())

The generator implements the range function

# range功能:
1.玩法一:
range(10)  # 0-9的数字
2. 玩法二:
range(3,10)  # 3-9的数字
3. 玩法三:
range(1, 10, 2) # 1,3,5,7,9

# 玩法2:
def my_range(start, end=None, step=1):
    # start => 2
    # end => 10
    if not end:
        end = start
        start = 0

    while start < end:
        yield start
        start += step

#
# res = my_range(2, 10, 2)
res = my_range(10)

for i in res:
    print(i)

yield传值

def index(name):
    print('%s 准备干饭' % name)
    while True:
        food = yield
        print('%s 开干 %s' % (name, food))

res=index('ly')
res.__next__()
# res.__next__()

res.send('苹果')
res.send('橘子')

yield跟return的对比

yield:
    1. 函数内遇到yield关键字把函数变成了生成器
    2. yield 也可以返回值,并且支持返回多个(元组形式)
    3. 遇到yield,函数不会结束,而是"停住"
    4. yield 也支持传值
return 
    1. 后面可以跟返回值,也支持返回多个(元组形式)
    2. 函数遇到return,会立马结束

Generator expression

# 1. 生成器的笔试题
# 求和
def add(n, i):
    return n + i


# 调用之前是函数 调用之后是生成器
def test():
    for i in range(4):
        yield i


g = test()  # 初始化生成器对象
for n in [1, 10]:
    g = (add(n, i) for i in g)
    '''
        第一次循环:
            g = (add(1, i) for i in g)
        第二次循环:
            g = (add(10, i) for i in (add(10, i) for i in g))
    '''
res = list(g)
print(res)

Common built-in functions

# print(abs(123))
# print(abs(-123))  # 求绝对值

# l = [1, 2, 3, 4,5,6,7]
# print(all(l))
# print(any(l))
# print(sum(l)) # 求和

# print(divmod(100,10))
# print(divmod(101,10))
# print(divmod(99,10))

'''
    100条数据,10条  10
    101条数据,10条  11
    99条数据   10条  10
'''
# num,mod = divmod(100, 10)
# if not mod:
#     page = num+1


string = """
# hahahahh
print('hello world')
"""
# eval(string)
# exec(string)

# a = 123
# s = 'aaaa'
# print(type(a) is int)
# print(type(s) is str)
# print(isinstance(s, int))  # 判断某个数据是不是某个实例

# print(chr(68))
# print(ord('A'))

# print(pow(2,3))  # 2
# print(pow(3,3))  # 2
# print(round(4.3))
# print(round(4.5))
# print(round(4.8))

# bytes()
s = 'aaa'
print(s.encode('utf8'))
res=bytes(s, 'utf8')
print(res)
print(res.decode('utf8'))
print(str(res,'utf8'))