record
1.函数作为变量
实参高阶函数、返回值高阶函数
列表.sort(), sorted(), max(), min()函数中key参数
key要求:一个函数、有一个参数、有一个返回值
2.迭代器和生成器
迭代器:将其他序列转化成迭代器、生成器
获取元素:next(),for-in
# 迭代器
iter1 = iter('hello')
print(next(iter))
print(iter.__next__())
for x in iter1:
print(x)
生成器:调用带有yield关键字的函数,就可以得到一个生成器
一个生成器能够产生多少数据,看函数执行完成会遇到多少次yield
# 生成器
def func1(num, pre=''):
width = len(str(num))
for x in range(1, num+1):
yield pre.str(x).zfill(width)
gen_id = func1(100)
print(next(id_gen))
print(next(id_gen))
gen_id2 = func1(50,'python1902')
print(next(id_gen2))
# 每次都会创建新的生成器,获取第一个元素
print('===:', next(func1(60)))
print('===:', next(func1(60)))
生成式
生成式本质还是生成器,只是写法更简洁
1.生成式的写法
1.1.语法:
(表达式 for 变量 in 序列)
1.2.展开:
def func():
for 变量 in 序列:
yield 表达式
func()
1.3.说明:
() - 固定写法
表达式 - 除了赋值语句以外的任何语句,比如:数据、变量、运算表达式、函数调用表达式等(这个表达式一般都和后面的变量有联系)
gen1 = (x for x in range(5))
print(gen1)
print(next(gen1))
print(next(gen1))
print(next(gen1))
print(next(gen1))
print(next(gen1))
# print(next(gen1)) # StopIteration
dict1 = {'a': 1, 'b': 2, 'c': 3}
gen2 = ((value, key)for key, value in dict1.items())
print(next(gen2))
print(dict(gen2))
"""
(1, 'a')
{2: 'b', 3: 'c'}
"""
练习:实现自己的dict函数,可以将序列转换成字典
2.第二种写法
2.1语法
(表达式 for 变量 in 序列 if 条件语句)
2.2.展开
def func():
for 变量 in 序列:
if 条件语句:
yield 表达式
gen = func()
3.补充:python的三目运算符
C语言 - 条件语句?值1:值2 (如果条件语句为真整个表达式的结果为值1,否则是值2)
python语言 - 值1 if 条件语句 else 值2 (如果条件语句为真整个表达式的结果为值1,否则是值2)
x = 3
a = 1 if x == 2 else 2
print(a)
file
1.数据持久化
程序中产生的数据默认是保存在内存中,程序结束数据会自动销毁。如果希望程序结束数据不销毁,那么需要对这个数据做数据持久化
数据持久化:将数据保存到文件中,然后将文件保存在磁盘/硬盘中
2.文件操作(对文件内容进行操作)
基本步骤:打开文件 -> 操作文件(读/改) -> 关闭文件(xx.close)
2.1.打开文件
open(file, mode='r', encoding=None) - 以指定的方式打开文件,并且返回文件对象
说明:
file - 字符传,文件路径,可以写绝对路径也可以写相对路径
绝对路径(一般不用) - 完整路径,例如:/Users/yanhan/Documents/python/April_qianfeng_study/April_28th_day11/python\ program/text.json
相对路径(需要先将文件保存在工程目录下)
./ - 代表当前目录
../ - 代表当前目录的上册目录
.../ - 代表当前目录的上册目录的上册目录
以此类推
open('./test.txt') # ./可以省略,等于open('test.txt')
open('./files/test2.txt')
open('../files/text2.txt')
mode - 字符串,文件的打开方式(决定打开文件后能够进行的操作,和操作方式)
'r' - 以只读的方式打开文件,读出来的数据是字符串
'w' - 以只写的方式打开文件,写入的数据是字符串
'rb'/'br' - 以只读的方式打开文件,读出来的数据是二进制数据
'wb'/'bw' - 以只写的方式打开文件,写入的数据是二进制数据
'a' - 以只写的方式打开文件,写入的数据是字符串
注意:如果是以读的方式打开文件,文件不存在会报错(FileNotFoundError)
如果以写的方式打开文件,文件不存在不会报错,并且会自动创建这个文件
encoding - 文本编码方式
'utf-8'(mac,linux默认) - 支持中文
'gbk'(windows默认) - 只支持英文
注意:只有文本文件才能设置encoding,二进制操作不能设置encoding
# f保存文件对象,只有打开文件才能得到文件对象
f = open('text.txt', 'w', encoding='utf-8')
2.2.操作文件
2.2.1.读操作
文件对象.read() - 返回文件中的内容
f = open('text.txt', 'w', encoding='utf-8')
f.write('累猴呀\n嘎嘎嘎')
f.close()
f2 = open('text.txt', 'r')
content = f2.read() # 读所有
print(content)
f2.seek(0) # 设置读写位置
print('====', f2.read())
f2.seek(0)
print('=====:', f2.readline().rstrip(), end='')
print('=====:', f2.readline())
"""
累猴呀
嘎嘎嘎
==== 累猴呀
嘎嘎嘎
=====: 累猴呀=====: 嘎嘎嘎
"""
读不到内容的时候返回空串
2.2.2.写操作
文件对象.write(内容) - 将内容写入指定文件中
3.字节类型(bytes)
3.1.数据来源:
3.1.1.将其他数据类型转换成bytes类型:
整型和字符串都可以转换成bytes
bytes(10)
bytes(10.2) # 浮点型不能转换
bytes(True)
bytes('abc', encoding='utf-8') # 字符串转化需要设置encoding
bytes('你好!'.encode()) # 字符串转换二进制方法
f3 = open('test.txt', 'wb')
f3.write('abc'.encode())
3.1.2.将bytes转字符串
b1 = '你好!'.encode()
str1 = str(b1, encoding='utf-8')
print('str1:', str1)
str2 = b1.decode(encoding='utf-8')
print('str2:', str1)
3.1.3.以'rb'/'br'的方式读文件(获取二进制)
3.二进制文件的读写
图片、视频、音频等都是二进制文件。这些文件只能以带'b'的方式打开然后操作
# 二进制读操作
image_f = open('file/luffy.jpeg', 'rb')
image_data = image_f.read()
print(type(image_date), image_data)
# 二进制写操作
n_f = open('new.jpeg', 'wb')
n_f.write(image_data)
# 下载网络图片
response = requests.get('https://ss0.baidu.com/6ONWsjip0QIZ8tyhnq/it/u=3611364264,2238752415&fm=58')
n_f2 = open('new2.jpeg', 'wb')
n_f2.write(response.content)
file2
1.打开文件
with open() as 文件对象:
文件的操作
(出了缩进就自动关闭文件)
2.数据持久化
练习:统计程序启动次数(将当前程序的启动次数打印出来)
json
1.什么是json数据
满足json格式要求的数据就是json数据;文件内容满足json格式要求,就是json文件
1.1.json格式要求
a.一个json中有且只有一个数据;
b.这个必须是json支持的数据类型的数据。
1.2.json支持的数据类型
数字类型(number) - 所有的数字(整数和小数),支持科学计数法
例如:10, -100, 12.32, 3e2
字符串(string) - 使用双引号引起来的字符集,支持转义字符
例如:"abc", "12山东黄金", "123\nabc", "\u4e00"
布尔值(boolean) - 只有true,false两个值
数组(array) - 相当于python中的列表,[12, "asd", true, [1, 123]]
字典(dictionary) - 相当于python中的字典,key必须为字符串
例如:{"name": "张三", "age": 23}
null - 相当于None,空值
2.python数据和json数据的相互转换
python中内置了一个json模块,用来支持json相关操作
2.1.json转python
json (转) python
数字 int/float
字符串 str, 有可能将双引号变成单引号
布尔 true,false->True,False
数组 list
字典 dict
null None
2.2.json.loads()
json.loads(字符串,encoding=编码方式) - 将json字符串转换成python对应的数据
注意:这的字符串要求字符串中的内容必须是json格式的数据(去掉字符串最外面的引号,本身就是一个json数据)
2.3.python转json
python (转) json
int/float 数字
bool 布尔,大写变小写
str 字符串,单引号变双引号
list/tuple 数组
dict 字典
None null
2.4.json.dumps()
json.dumps(数据) - 将python数据转换成json格式的字符串
网友评论