Python 生成器,内置函数I

举报
Yuchuan 发表于 2019/12/16 20:01:11 2019/12/16
【摘要】 Python 生成器的理解。

1 生成器

1.1 初识生成器

什么是生成器?这个概念比较模糊,各种文献都有不同的理解,但是核心基本相同。生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念。不是相同么?为什么还要创建生成器?生成器和迭代器也有不同,唯一的不同就是:迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来的,(比如文件句柄,iter([1,2,3])。生成器是需要我们自己用python代码构建的工具。最大的区别也就如此了。

1.2 生成器的构建方式

在python中有三种方式来创建生成器:

  1. 通过生成器函数

  2. 通过生成器推导式

  3. python内置函数或者模块提供(其实1,3两种本质上差不多,都是通过函数的形式生成,只不过1是自己写的生成器函数,3是python提供的生成器函数而已)

1.3 生成器函数

我们先来研究通过生成器函数构建生成器。

首先,我们先看一个很简单的函数:

def func():
    print("Hello World!")
    return "you are fine"


ret_str = func()
print(ret_str)

结果:

D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo002.py
Hello World!
you are fine

Process finished with exit code 0

将函数中的return换成yield,这样func就不是函数了,而是一个生成器函数

def func():
    print("Hello World!")
    yield "you are fine"


ret_str = func()
print(ret_str)

结果:

D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo002.py
<generator object func at 0x000001B29A4AC318>

Process finished with exit code 0

运行的结果和最上面的不一样,为什么呢?? 由于函数中存在yield,那么这个函数就是一个生成器函数.

我们在执行这个函数的时候.就不再是函数的执行了.而是获取这个生成器对象,那么生成器对象如何取值呢?

之前我们说了,生成器的本质就是迭代器.迭代器如何取值,生成器就如何取值。所以我们可以直接执行next()来执行以下生成器

def func():
    print("Hello World!")
    yield "you are fine"


genera = func()  # 此时是获取一个生成器对象而并不是函数的执行
ret_str = genera.__next__()  # 这个时候函数才会去执行
print(ret_str)  # 并且yield将生产出来的数据“you are fine”赋值给ret_str

结果:

D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo002.py
Hello World!
you are fine

Process finished with exit code 0

并且我的生成器函数中可以写多个yield。

def func():
    print("Hello World!")
    yield "you are fine"

    print("how do you do")
    yield "his name"

    print("文化英")
    yield "漂亮么"


genera = func()  # 此时是获取一个生成器对象而并不是函数的执行
ret_str = genera.__next__()  # 这个时候函数才会去执行
print(ret_str)  # 并且yield将生产出来的数据“you are fine”赋值给ret_str

ret_str1 = genera.__next__()  # 这个时候函数才会去执行
print(ret_str1)  # 并且yield将生产出来的数据“his name”赋值给ret_str1

ret_str2 = genera.__next__()  # 这个时候函数才会去执行
print(ret_str2)  # 并且yield将生产出来的数据“漂亮么”赋值给ret_str2


ret_str2 = genera.__next__() # 执行完之后还要继续执行的话会报错 :StopIteration

结果:

D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo002.py
Hello World!
you are fine
how do you do
his name
文化英
漂亮么

Process finished with exit code 0

yield与return的区别:

        return一般在函数中只设置一个,他的作用是终止函数,并且给函数的执行者返回值。

        yield在生成器函数中可设置多个,他并不会终止函数,next会获取对应yield生成的元素。

举例:

我们来看一下这个需求:老男孩向楼下卖包子的老板订购了10000个包子.包子铺老板非常实在,一下就全部都做出来了  

def eat():
    list1 = []
    for i in range(10000):
        list1.append(f'包子{i}')

    return list1


ret_data = eat()
print(ret_data)

结果:

D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo002.py
['包子0', '包子1', '包子2', '包子3', '包子4', '包子5', '包子6', '包子7', '包子8', '包子9', '包子10', '包子11', '包子12', ......'包子9998', '包子9999']

Process finished with exit code 0

这样做没有问题,但是我们由于学生没有那么多,只吃了20个左右,剩下的8000个,就只能占着一定的空间,放在一边了。如果包子铺老板效率够高,我吃一个包子,你做一个包子,那么这就不会占用太多空间存储了,完美。

def eat():
    for i in range(10000):
        yield "包子" + str(i)


genera = eat()
# ret_data = genera.__next__()
# print(ret_data)

for i in range(20):
    ret_data = next(genera)
    print(ret_data)

结果:

D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo002.py
包子0
包子1
包子2
包子3
包子4
包子5
包子6
包子7
包子8
包子9
包子10
包子11
包子12
包子13
包子14
包子15
包子16
包子17
包子18
包子19

Process finished with exit code 0

这两者的区别:

    第一种是直接把包子全部做出来,占用内存。

    第二种是吃一个生产一个,非常的节省内存,而且还可以保留上次的位置。

def eat():
    for i in range(10000):
        yield "包子" + str(i)


genera = eat()
# ret_data = genera.__next__()
# print(ret_data)

for i in range(20):
    ret_data = next(genera)
    print(ret_data)

for i in range(30):
    ret_data = next(genera)
    print(ret_data)

# 多次next包子的号码是按顺序记录的

结果:

D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo002.py
包子0
包子1
包子2
包子3
包子4
包子5
包子6
包子7
包子8
包子9
包子10
包子11
包子12
包子13
包子14
包子15
包子16
包子17
包子18
包子19
包子20
包子21
包子22
包子23
包子24
包子25
包子26
包子27
包子28
包子29
包子30
包子31
包子32
包子33
包子34
包子35
包子36
包子37
包子38
包子39
包子40
包子41
包子42
包子43
包子44
包子45
包子46
包子47
包子48
包子49

Process finished with exit code 0

1.4 send 方法(了解,不讲)

·接下来我们再来认识一个新的东西,send方法

def eat(name):
    print(f'{name} ready to eat!')
    while 1:
        food = yield
        print(f'{name} start to eat {food}')


# next 只能获取yield生成的值,不能传递值
genera = eat("段于传")
next(genera)
next(genera)
next(genera)

结果:

D:\YuchuanProjectData\PythonProject\venv\Scripts\python.exe D:/YuchuanProjectData/PythonProject/YuchuanDemo002.py
段于传 ready to eat!
段于传 start to eat None
段于传 start to eat None

Process finished with exit code 0
# 而使用send这个方法是可以的
def make_genera(name):
    print(f"{name}ready to eat!")
    while 1:
        food = yield "骨头"
        print(f"{name}start to eat {food}")


genera = make_genera("妞妞")
next(genera)  # 第一次必须使用next让指针停留在第一个yield的后面
# 与next一样,可以获取到yield的值
ret_data = genera.send("哗哗")
print(ret_data)
# ret_data = genera.__next__()
# print(ret_data)

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo004.py
妞妞ready to eat!
妞妞start to eat 哗哗
骨头

Process finished with exit code 0
def make_genera(name):
    print(f"{name}ready to eat!")
    while 1:
        food = yield
        print(f"{name}start to eat {food}")


genera = make_genera("妞妞")
next(genera)  # 第一次必须使用next让指针停留在第一个yield的后面
genera.send("骨头")
genera.send("蔬菜")
genera.send("水果")

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo004.py
妞妞ready to eat!
妞妞start to eat 骨头
妞妞start to eat 蔬菜
妞妞start to eat 水果

Process finished with exit code 0

send和next()区别:

        相同点:

            send 和 next()都可以让生成器对应的yield向下执行一次。

            都可以获取到yield生成的值。

        不同点:

            第一次获取yield值只能用next不能用send(可以用send(None))。

            send可以给上一个yield置传递值。

1.4 yield from

在python3中提供一种可以直接把可迭代对象中的每一个数据作为生成器的结果进行返回

# 对比yield 与 yield from
def make_genera():
    list_data = ["丑小鸭", "白天鹅", "小乳猪", "嫦娥"]
    yield list_data


genera = make_genera()
print(genera)
ret_data = next(genera)  # 只是返回一个列表
print(ret_data)

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo004.py
<generator object make_genera at 0x7efcff42c750>
['丑小鸭', '白天鹅', '小乳猪', '嫦娥']

Process finished with exit code 0
def make_genera():
    list_data = ["丑小鸭", "白天鹅", "小乳猪", "嫦娥"]
    yield from list_data


genera = make_genera()
print(genera)
# 他会将这个迭代器对象(列表)的每个元素当作迭代器的每个结果返回
print(next(genera))
print(next(genera))
print(next(genera))
print(next(genera))

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo004.py
<generator object make_genera at 0x7efc22c0b750>
丑小鸭
白天鹅
小乳猪
嫦娥

Process finished with exit code 0
"""
yield from ["丑小鸭", "白天鹅", "小乳猪", "嫦娥"]
等同于:
   yield "丑小鸭"
   yield "白天鹅"
   yield "小乳猪"
   yield "嫦娥"
"""

有个小坑,yield from 是将列表中的每一个元素返回,所以 如果写两个yield from 并不会产生交替的效果

def make_genera():
    list_data = ["丑小鸭", "白天鹅", "小乳猪", "嫦娥"]
    list_data1 = ["字母", "老詹", "胖奇奇", "浓眉"]
    yield from list_data
    yield from list_data1


genera = make_genera()
print(genera)
# 他会将这个迭代器对象(列表)的每个元素当作迭代器的每个结果返回
for i in genera:
    print(i)

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo004.py
<generator object make_genera at 0x7f9cd5a59750>
丑小鸭
白天鹅
小乳猪
嫦娥
字母
老詹
胖奇奇
浓眉

Process finished with exit code 0

2. 推导式

本节我们讲列表推导式,生成器表达式以及其他推导式,我认为推导式就是构建比较有规律的列表,生成器,字典等一种简便的方式。那么他如何简便呢?看下面的例题:

2.1列表推导式

首先我们先看一下这样的代码,给出一个列表,通过循环,想列表中添加1~10:

list_data = []
for i in range(1, 11):
    list_data.append(i)

print(list_data)

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo004.py
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Process finished with exit code 0

那么按照上面的要求我们用列表推导式写一下:

list_data = [i for i in range(1, 11)]
print(list_data)

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo004.py
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Process finished with exit code 0

怎么样?一行搞定,上面这个代码就是列表推导式,接下来我们将列表推导式进行一个分类:

列表推导式分为两种模式:

    1.循环模式:[变量(加工的变量) for 变量 in iterable]

    2.筛选模式: [变量(加工的变量) for 变量 in iterable if 条件]

当然还有多层循环的,这个我们一会就会讲到,那么我们先来看循环模式。

2.2 循环模式

刚才我们看到的就是循环模式,那么有同学会问到,什么叫' 加工的变量'? 这个也比较简单,接下来我们做几道题:

  1. 将10以内所有整数的平方写入列表。

list_data = [i * i for i in range(1, 11)]
print(list_data)

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo004.py
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

Process finished with exit code 0

  2. 100以内所有的偶数写入列表.

# list_data = [i for i in range(101) if i % 2 == 0]
# print(list_data)

list_data = [i for i in range(0, 101, 2)]
print(list_data)

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo004.py
[0, 2, 4, 6, 8, 10, ...... 98, 100]

Process finished with exit code 0

  3. 从python1到python20写入列表lst

list_data = [f"python{i}" % i for i in range(1, 21)]
print(list_data)

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo004.py
['python1', 'python2', 'python3', ...... , 'python17', 'python18', 'python19', 'python20']

Process finished with exit code 0

上面那个格式化输出的变量f'python{i}',就是加工的变量。

上面做的那三个就是循环模式,比较简单,接下来我们研究筛选模式。

2.3 筛选模式

筛选模式就是在上面的基础上加上一个判断条件,将满足条件的变量留到列表中。

将这个列表中大于3的元素留下来

# list_data = [12, 88, 786, 1, 5, 512, 0, 99, 3, 76, 2]
# list_data1 = []
# for i in list_data:
#     if i > 3 or i == 3:
#         list_data1.append(i)
# list_data = list_data1
# print(list_data)

list_data = [12, 88, 786, 1, 5, 512, 0, 99, 3, 76, 2]
print([i for i in list_data if i > 3 or i == 3])

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo004.py
[12, 88, 786, 5, 512, 99, 3, 76]

Process finished with exit code 0

通过我给大家的演示,大家做几道题:

  1. 三十以内可以被三整除的数。

# list_data = [i for i in range(30) if i % 3 == 0]
list_data = [i for i in range(30) if i % 3 is 0]
print(list_data)

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo004.py
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

Process finished with exit code 0

    2. 过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母

list_data = ['lebran', 'aa', 'antonni', 'b', 'dehuaite']
print([i.upper() for i in list_data if len(i) > 3])

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo004.py
['LEBRAN', 'ANTONNI', 'DEHUAITE']

Process finished with exit code 0

   3. 找到嵌套列表中名字含有两个‘e’的所有名字(有难度

names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
         ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]

print([name for lis in names for name in lis if name.count("e") >= 2])
# 注意遍历顺序,这是实现的关键

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo004.py
['Jefferson', 'Wesley', 'Steven', 'Jennifer']

Process finished with exit code 0

列表推导式基本上讲完了,当然今天会做一些有关列表推导式的题,让大家更加深入的了解。

2.4 生成器表达式

生成器表达式和列表推导式的语法上一模一样,只是把[]换成()就行了。比如将十以内所有数的平方放到一个生成器表达式中

gen = (i * i for i in range(11))
print(gen)
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo004.py
<generator object <genexpr> at 0x7fc9b14f4750>
0
1
4
9

Process finished with exit code 0

生成器表达式也可以进行筛选

gen = (i for i in range(1, 101) if i % 3 is 0)
for num in gen:
    print(num)

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo004.py
3
6
9
.
.
.
.
.
.
99

Process finished with exit code 0

生成器表达式和列表推导式的区别:

  1. 列表推导式比较耗内存,所有数据一次性加载到内存。而.生成器表达式遵循迭代器协议,逐个产生元素。

  1. 得到的值不一样,列表推导式得到的是一个列表.生成器表达式获取的是一个生成器

  2. 列表推导式一目了然,生成器表达式只是一个内存地址。

    无论是生成器表达式,还是列表推导式,他只是Python给你提供了一个相对简单的构造方式,因为使用推导式非常简单,所以大多数都会为之着迷,这个一定要深重,推导式只能构建相对复杂的并且有规律的对象,对于没有什么规律,而且嵌套层数比较多(for循环超过三层)这样就不建议大家用推导式构建。

生成器的惰性机制: 生成器只有在访问的时候才取值,说白了.你找他要才给你值.不找他要.他是不会执行的.

2.5 其他相关的推导式(了解):

字典推导式

根据名字应该也能猜到,推到出来的是字典

lst1 = ['jay', 'jj', 'meet']
lst2 = ['周杰伦', '林俊杰', '郭宝元']

dic = {lst1[i]: lst2[i] for i in range(len(lst1))}
print(dic)

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo004.py
{'jay': '周杰伦', 'jj': '林俊杰', 'meet': '郭宝元'}

Process finished with exit code 0

集合推导式

集合推导式可以帮我们直接生成一个集合,集合的特点;无序,不重复 所以集合推导式自带去重功能

list_data = [3, 2, 6, 1, -8, 4, -9, 5]
set_data = (abs(i) for i in list_data)
print(set_data)

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo004.py
<generator object <genexpr> at 0x7f36270f8750>

Process finished with exit code 0

3. 内置函数Ⅰ

本节我们讲内置函数。 首先来说,函数就是以功能为导向,一个函数封装一个功能,那么Python将一些常用的功能(比如len)给我们封装成了一个一个的函数,供我们使用,他们不仅效率高(底层都是用C语言写的),而且是拿来即用,避免重复早轮子,那么这些函数就称为内置函数,到目前为止python给我们提供的内置函数一共是68个,由于时间关系以及考虑这些函数的不同重要性我们会挑常用的重要的内置函数去讲,就是下面红色黄色背景的内置函数,剩下的内置函数你们参照着我的博客自己练习一下即可。

我把这些内置函数进行分类:

黄色一带而过

all() any()bytes()
callable()
chr()complex()divmod()eval()exec()
format()frozenset()globals()hash()help()id()input()int()iter()
locals()next()
oct()ord()pow()repr()round()

红色重点讲解

abs()
enumerate()
filter()map()max()min()open()range()print()
len()list()dict()str()float()reversed()set()sorted()sum()
tuple()
type()zip()dir()




蓝色后续会讲

classmethod()delattr()getattr()hasattr()issubclass()isinstance()object()property()
setattr()staticmethod()supper()




上面的黄色,红色的内置函数是在这两天讲完的(讲过的就不讲了),蓝色的讲完面向对象会给大家补充,剩余还有一些课上就不讲了,课下练习一下就可以。

1. eval:执行字符串类型的代码,并返回最终结果。

ret_data = eval("6+8")
print(ret_data)
n = 98
print(eval("n+66"))
eval("print(8888888)")

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo005.py
14
164
8888888

Process finished with exit code 0

2. exec:执行字符串类型的代码。

s = """
    for i in [1,2,3,4,5,6]:
        print(i)
"""

exec(s)
执行会报错:
/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo005.py
Traceback (most recent call last):
  File "/home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo005.py", line 12, in <module>
    exec(s)
  File "<string>", line 2
    for i in [1,2,3,4,5,6]:
    ^
IndentatireplaceString: unexpected indent

Process finished with exit code 1



s = """
for i in [1,2,3,4,5,6]:
    print(i)
"""

exec(s)

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo005.py
1
2
3
4
5
6

Process finished with exit code 0

3. hash:获取一个对象(可哈希对象:int,str,Bool,tuple)的哈希值。

print(hash(1234))
print(hash("华英"))
print(hash("lola"))
print(hash(True))
print(hash(False))
print(hash((1, 4, 6, 8, 9)))

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo005.py
1234
5708672712691275913
-5999392508949620886
1
0
-5541764491676739187

Process finished with exit code 0

4. help:函数用于查看函数或模块用途的详细说明。

print(help(list))
print(help(str.split))

5. callable:函数用于检查一个对象是否是可调用的。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。

name = "文华英"


def func():
    pass


print(callable(name))
print(callable(func))

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo005.py
False
True

Process finished with exit code 0

6. int:函数用于将一个字符串或数字转换为整型。

print(int())
print(int("1231"))
print(int(3.89))
print(int("010110", base=2))

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo005.py
0
1231
3
22

Process finished with exit code 0

7. float:函数用于将整数和字符串转换成浮点数。

8. complex:函数用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数。。

print(float(42))
print(complex(2, 6))

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo005.py
42.0
(2+6j)

Process finished with exit code 0


9. bin:将十进制转换成二进制并返回。

10. oct:将十进制转化成八进制字符串并返回。

11. hex:将十进制转化成十六进制字符串并返回。

print(bin(20), type(bin(20)))
print(oct(20), type(oct(20)))
print(hex(20), type(oct(20)))

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo005.py
0b10100 <class 'str'>
0o24 <class 'str'>
0x14 <class 'str'>

Process finished with exit code 0


12. divmod:计算除数与被除数的结果,返回一个包含商和余数的元组(a // b, a % b)。

13. round:保留浮点数的小数位数,默认保留整数。

14. pow:求x**y次幂。(三个参数为x**y的结果对z取余)

print(divmod(7, 2))  # (3, 1)
print(round(7 / 3, 2))  # 2.33
print(round(7 / 3))  # 2
print(round(3.32567, 3))  # 3.326
print(pow(2, 3))  # 两个参数为2**3次幂
print(pow(2, 3, 3))  # 三个参数为2**3次幂,对3取余。

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo005.py
(3, 1)
2.33
2
3.326
8
2

Process finished with exit code 0

15. bytes:用于不同编码之间的转化。

s = '你好'
bs = s.encode('utf-8')
print(bs)

s1 = bs.decode('utf-8')
print(s1)

bs = bytes(s, encoding='utf-8')
print(bs)

b = '你好'.encode('gbk')
b1 = b.decode('gbk')

print(b1.encode('utf-8'))

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo005.py
b'\xe4\xbd\xa0\xe5\xa5\xbd'
你好
b'\xe4\xbd\xa0\xe5\xa5\xbd'
b'\xe4\xbd\xa0\xe5\xa5\xbd'

Process finished with exit code 0

16. ord:输入字符找该字符编码的位置

17. chr:输入位置数字找出其对应的字符

# ord 输入字符找该字符编码的位置
print(ord('a'))
print(ord('中'))

# chr 输入位置数字找出其对应的字符
print(chr(97))
print(chr(20013))

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo005.py
97
20013
a
中

Process finished with exit code 0

18. repr:返回一个对象的string形式(原形毕露)。

# %r  原封不动的写出来
name = 'YuchuanHuaying'
print('我叫%r' % name)

# repr 原形毕露
print(repr('{"name":"alex"}'))
print('{"name":"alex"}')

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo005.py
我叫'YuchuanHuaying'
'{"name":"alex"}'
{"name":"alex"}

Process finished with exit code 0


19. all:可迭代对象中,全都是True才是True

20. any:可迭代对象中,有一个True 就是True

print(all([1, 2, True, 0]))
print(all([1, 2, True, 32]))
print(any([1, '', 0]))
print(any([False, '', 0]))

结果:

/usr/local/bin/python3 /home/yuchuantester/YuchuanData/PythonData/PythonProject/YuchuanDemo005.py
False
True
True
False

Process finished with exit code 0



【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。