python函数基础(3)
第1章 编码补充
1.1 字符编码对照表
1.2 编码特性
1.4 encode/decode
第2章 集合
2.1 特点
2.2 【重点】作用:去重
2.3 常用操作
2.3.1 删除
2.3.2 交集判断-isdisjoint
2.4 列表转换集合
2.5 集合转换列表
第3章 深浅copy
3.1 共用内存地址
3.2 copy参数
3.3 copy特性
3.3.1 例:浅copy
3.3.2 例:深copy
3.3.3 切片浅copy
第4章 文件操作
4.1 文件打开方式-open
4.2 文件句柄
4.3 读r
4.3.1 默认:方式全部读出来
4.3.2 read(n):读一部分
4.3.3 rb
4.3.4 readline()
4.3.5 readlines()
4.3.6 for 循环
4.3.7 r+ r+b
4.4 写:w
4.4.1 wb
4.4.2 图片的读写
4.4.3 图片的写入
4.4.4 w+
4.4.5 w+b
4.5 追加:a
4.5.1 ab
4.5.2 a+
4.5.3 a+b
4.6 其他操作方法
4.6.1 常用参数列表
4.6.2 with open
4.6.3 更改文件
4.6.4 版本升级
第5章 函数
5.1 初识函数
5.2 函数返回值
5.2.1 return
5.2.2 例:
5.3 函数传参
5.3.1 形参
5.3.2 实参
第6章 拾遗
6.1 'is'/'id'/'=='区别
6.2 小数据池
第1章 编码补充
1.1 字符编码对照表
编码格式 |
别名 |
表示内容 |
例举 |
ascii |
英文 |
可以表示,数字,字母 特殊字符; 字节:8位表示一个字节; 字符:是你看到的内容的最小组成单位 |
abc : a 一个字符。 中国:中 一个字符 a : 0000 1011 |
unicode |
万国码 |
可以表示万国语言; 字节:32位表示一个字节 |
a : 0000 1011 0000 1011 0000 1011 0000 1011 中: 0000 1011 0000 1111 0000 1011 0000 1011 |
gbk |
国标 |
英文表示用一个字节 中文表示用两个字节 |
a: 0000 1011 中:0000 1011 0000 1011 两个字节 |
utf-8 |
通用 |
最少用8位表示一个字符 |
a: 0000 1011 欧洲: 0000 1011 0000 1011 亚洲中:0000 1011 0000 1011 0000 1011 |
1.2 编码特性
u 不同编码之间的二进制是不能互相识别的。
u 对于文件的存储,及传输 不能是unicode的编码。
u bytes:内部编码方式(非unicode,utf-8,gbk.gb2312...)
u str : 内部编码方式unicode
1.3 例:
# !/usr/bin/env python
# -*- coding:utf-8 -*-
s1 = 'alex'
b1 = s1.encode('utf-8')
print(b1)
b1 = b'alex'
print(s1.capitalize())
print(b1.capitalize())
s1 = '中国'
b1 = s1.encode('utf-8')
print(b1)
输出
b'alex'
Alex
b'Alex'
b'\xe4\xb8\xad\xe5\x9b\xbd'
1.4 encode/decode
s1 = 'alex'
# str ---> bytes encode 编码
b1 = s1.encode('utf-8')
print(b1)
#bytes---> str decode 解码
s2 = b1.decode('utf-8')
print(s2)
输出
b'alex'
alex
第2章 集合
2.1 特点
l 每个元素必须是不可变类型(可hash,可作为字典的key)
l 没有重复的元素,去重
l 无序,常用关系测试
2.2 【重点】作用:去重
符号一览表
符号 |
定义 |
| |
合集 |
& |
交集 |
- |
差集 |
^ |
对称差集 |
== |
相同集合 |
>,>= ,<,<= |
父集,子集 |
练习:
pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
linuxs={'wupeiqi','oldboy','gangdan'}
#求出即报名python又报名linux课程的学员名字集合
print(pythons & linuxs)
#求出所有报名的学生名字集合
print((pythons | linuxs))
print(len(pythons | linuxs))
#求出只报名python课程的学员名字
print(pythons - linuxs)
#求出没有同时这两门课程的学员名字集合
print(pythons ^linuxs)
输出
C:\python3\python.exe D:/python/untitled/two_day.py
{'wupeiqi', 'gangdan'}
{'biubiu', 'gangdan', 'alex', 'oldboy', 'wupeiqi', 'yuanhao', 'egon'}
7
{'egon', 'biubiu', 'yuanhao', 'alex'}
{'biubiu', 'oldboy', 'alex', 'egon', 'yuanhao'}
2.3 常用操作
2.3.1 删除
sl={1,2,3,'a',4}
print(sl.pop())
sl.remove('a')
sl.remove('as')
print(sl)
输出:
Traceback (most recent call last):
File "D:/python/untitled/two_day.py", line 233, in <module>
sl.remove('as')
KeyError: 'as'
注意:
l pop随机删除,并返回删除的结果
l remove 单纯的删除,不会返回结果,如果删除的元素不在则报错
2.3.2 交集判断-isdisjoint
sl={1,2,3,'a',4}
s2={4,5}
print(sl.isdisjoint(s2))
如果sl和s2没有交集则返回True
2.4 列表转换集合
l1 = {1,2,3,4,52,33,33,4,4,5}
print(set(l1))
输出
C:\python3\python.exe D:/python/untitled2/python_auto/lianxi3.py
{1, 2, 3, 4, 33, 5, 52}
2.5 集合转换列表
set = {1,2,3,4,52,33,33,4,4,5}
print(list(set))
输出
C:\python3\python.exe D:/python/untitled2/python_auto/lianxi3.py
[1, 2, 3, 4, 33, 5, 52]
第3章 深浅copy
3.1 共用内存地址
s1 = [1, 2, 3]
s2 = s1 # 共用一个
s1.append(666)
print(s1, s2)
输出
[1, 2, 3, 666] [1, 2, 3, 666]
[1, 2, 3, [11, 22, 666]] [1, 2, 3, [11, 22, 666]]
3.2 copy参数
s1 = [1, 2, 3]
s2 = s1.copy()
s1.append(666)
print(s1, s2)
输出
[1, 2, 3, 666] [1, 2, 3]
3.3 copy特性
u 浅copy:使用copy参数,第一层各自独立,第二层开始,共用一个内存地址
u 深copy:调用copy模块,无论多少层,都是相互独立的
3.3.1 例:浅copy
s1 = [1, 2, 3,[11,22]]
s2 = s1.copy()
s1[-1].append(666)
print(s1, s2)
print(id(s1), id(s2))
print(id(s1[-1]), id(s2[-1]))
输出
s1 = [1, 2, 3,[11,22]]
s2 = s1.copy()
s1[-1].append(666)
print(s1, s2)
print(id(s1), id(s2))
print(id(s1[-1]), id(s2[-1]))
3.3.2 例:深copy
import copy
##第一层追加
s1 = [1, 2, 3,[11,22]]
s2 = copy.deepcopy(s1)
s1.append(666)
print(s1, s2)
##第二层追加
s1 = [1, 2, 3,[11,22]]
s2 = copy.deepcopy(s1)
s1[-1].append(666)
print(s1, s2)
输出
[1, 2, 3, [11, 22], 666] [1, 2, 3, [11, 22]]
[1, 2, 3, [11, 22, 666]] [1, 2, 3, [11, 22]]
3.3.3 切片浅copy
1)第一层追加
s1 = [1, 2, 3, [11, 22]]
s2 = s1[:]
s1.append(666)
print(s1, s2)
输出
C:\python3\python.exe "D:/python/untitled2/python_3/05 深浅copy.py"
[1, 2, 3, [11, 22], 666] [1, 2, 3, [11, 22]]
2)第二层追加
s1 = [1, 2, 3, [11, 22]]
s2 = s1[:]
# s1.append(666)
s1[-1].append(666)
print(s1, s2)
输出
C:\python3\python.exe "D:/python/untitled2/python_3/05 深浅copy.py"
[1, 2, 3, [11, 22, 666]] [1, 2, 3, [11, 22, 666]]
第4章 文件操作
4.1 文件打开方式-open
解释:open()调用的内置函数,内置函数调用的系统内部的open,
#!/usr/bin/env python
# -*- coding:utf-8 -*-
f1 = open(r'd:/superman.txt', encoding='utf-8', mode='r')
print(f1.read())
f1.close()
输出
C:\python3\python.exe "D:/python/untitled2/python_3/06 文件操作.py"
天空没有留下我的痕迹,但我已飞过.....
______泰戈尔
4.2 文件句柄
u 解释:f1 文件句柄,又称之为(f,file,file_hander,f_h....)
u 说明:一切对文件进行的操作都是基于文件句柄f1.
u 执行流程:
1.打开文件,产生文件句柄。
2.对文件句柄进行操作。
3.关闭文件句柄。
u 报错原因:
1.编码错误编码不一致,前面加r或者在加上// 进行转义解决路径问题
UnicodeDecodeError: 'gbk' codec can't decode byte 0xab in position 15: illegal multibyte sequence
2.路径错误。
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
3.\未转义。
r'd:/superman.txt',
'd://superman.txt',
4.3 读r
4.3.1 默认:方式全部读出来
f1 = open('log1', encoding='utf-8')
content = f1.read()
print(content)
f1.close()
输出
C:\python3\python.exe "D:/python/untitled2/python_3/06 文件操作.py"
111666333222
4.3.2 read(n):读一部分
f1 = open('log1', encoding='utf-8')
content = f1.read(3)
print(content)
f1.close()
输出
C:\python3\python.exe "D:/python/untitled2/python_3/06 文件操作.py"
111
4.3.3 rb
解释:
u r 模式 read(n) n 按照字符读取。
u rb 模式 read(n) n 按照字节读取。
例:
f1 = open('log1', mode='rb')
print(f1.read(3).decode('utf-8'))
f1.close()
输出
C:\python3\python.exe "D:/python/untitled2/python_3/06 文件操作.py"
我
例:
f1 = open('log1', mode='rb')
print(f1.read(4).decode('utf-8'))
f1.close()
输出
C:\python3\python.exe "D:/python/untitled2/python_3/06 文件操作.py"
Traceback (most recent call last):
File "D:/python/untitled2/python_3/06 文件操作.py", line 27,
4.3.4 readline()
解释:按行读取
f1 = open('log1', encoding='utf-8')
print(f1.readline())
print(f1.readline())
print(f1.readline())
f1.close()
输出
文件操作.py"
111666333222
12321321321
21312321321321
4.3.5 readlines()
解释:全部读出来并显示为列表的形式
f1 = open('log1', encoding='utf-8')
print(f1.readlines())
f1.close()
输出
C:\python3\python.exe "D:/python/untitled2/python_3/06 文件操作.py"
['111666333222\n', '12321321321\n', '21312321321321']
4.3.6 for 循环
f1 = open('log1', encoding='utf-8')
for line in f1:
print(line)
f1.close()
输出
C:\python3\python.exe "D:/python/untitled2/python_3/06 文件操作.py"
111666333222
12321321321
21312321321321
4.3.7 r+ r+b
解释:r+ 读写规则先读后写
f1 = open('log1', encoding='utf-8', mode='r+')
print(f1.read())光标读到最后
f1.write('777')在最后插入777
print(f1.read())光标移动到最后所以这一次读没有输出
f1.close()
输出
C:\python3\python.exe "D:/python/untitled2/python_3/06 文件操作.py"
6664546789
12321321321
21312321321321#并没有777而是再源文件中生成
4.4 写:w
u 没有文件,新建文件写入内容。
u 有原文件,先清空内容,在写入新内容。
例:
f1 = open('log2', encoding='utf-8', mode='w')
f1.write('fdksagdfsa')
f1.close()
输出
C:\python3\python.exe "D:/python/untitled2/python_3/06 文件操作.py"
Process finished with exit code 0
清空源文件,生成新的字符串fdksagdfsa
4.4.1 wb
4.4.2 图片的读写
f1 = open('1.jpg', mode='rb')
content = f1.read()
print(content)
输出
C:\python3\python.exe "D:/python/untitled2/python_3/06 文件操作.py"
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\x01\x00\x00\xff\xdb\x00C\x00\x02\x01\x01\x01\x01\x01\x02\x01\x01\x01\x02\x02\x02\x02\x02\x04\x03\x02\x02\x02\x02\x05\x04\x04\x03\x04\x06\x05\x06\x06\x06\x05\x06\x06\x06\x07\t
4.4.3 图片的写入
f1 = open('1.jpg', mode='rb')
content = f1.read()
f2 = open('2.jpg', mode='wb')
f2.write(content)
f1.close()
f2.close()
图片二被清空,图片1写入图片2
4.4.4 w+
解释:先读后写
f1 = open('log2', encoding='utf-8', mode='w+')
f1.write('superman')
f1.seek(0)
print(f1.read())
f1.close()
输出
C:\python3\python.exe "D:/python/untitled2/python_3/06 文件操作.py"
superman
先清空在写入Superman
4.4.5 w+b
4.5 追加:a
解释 :没有文件,新建文件写入内容
f1 = open('log3', encoding='utf-8', mode='a')
f1.write('alex 666')
f1.write('\nalex 666')
f1.close()
输出
alex 666
alex 666
4.5.1 ab
解释:b参数的操作都是非文字类的文件
4.5.2 a+
解释:在文件末尾追加写入
f1 = open('log3', encoding='utf-8', mode='a+')
f1.write('python')
f1.seek(0)
print(f1.read())
f1.close()
输出
C:\python3\python.exe "D:/python/untitled2/python_3/06 文件操作.py"
alex 666
alex 666python
4.5.3 a+b
4.6 其他操作方法
4.6.1 常用参数列表
常用参数 |
解释 |
readable |
是否可读 |
writable |
是否可写 |
f1.seek(12) |
任意调整 |
f1.seek(0,2) |
光标调整到最后 |
f1.seek(0) |
光标调整到开头 |
f1.tell() |
告诉光标的位置 |
f1.truncate(3) |
按照字节对原文件进行截取必须在a 或 a+ 模式 |
例
f1 = open('log3', encoding='utf-8', mode='a+')
print(f1.readable())
print(f1.writable())
f1.close()
输出
True
True
例:
f1 = open('log3', encoding='utf-8', mode='a')
print(f1.readable())
print(f1.writable())
f1.close()
输出
True
False
4.6.2 with open
解释:不用关闭文件句柄
with open('log1', encoding = 'utf-8') as f1,\
open('log2', encoding='utf-8', mode='w') as f2:
con f2.write(content) tent = f1.read()
4.6.3 更改文件
u 以读模式打开原文件。
u 以写的模式打开一个新文件。
u 将原文件读出按照要求修改将修改后的内容写入新文件
u 删除原文件。
u 将新文件重命名原文件。
例:
import os
with open('file', encoding='utf-8') as f1,\
open('file.bak', encoding='utf-8', mode='w') as f2:
old_content = f1.read()
new_content = old_content.replace('alex', 'SB')
f2.write(new_content)
os.remove('file')
os.rename('file.bak', 'file')
4.6.4 版本升级
import os
with open('file', encoding='utf-8') as f1,\
open('file.bak', encoding='utf-8', mode='w') as f2:
for line in f1:
new_line = line.replace('SB','alex')
f2.write(new_line)
os.remove('file')
os.rename('file.bak', 'file')
第5章 函数
5.1 初识函数
u 目的:解决代码重复性问题,提高可读性
u 函数格式:
'''
def 关键字 函数名():
函数体
函数执行:函数名()
函数:以功能为导向。
'''
5.2 函数返回值
5.2.1 return
u 终止函数。
u 给函数的执行者返回值
return 或者 return None
return 单个值
return 多个值 会将多个值放到一个元组中,将元组返回个函数的执行者
5.2.2 例:
s = 'lkfjsjulkjdgjdsf'
def my_len():
count = 0
for i in s:
count += 1
return count
print(my_len())
5.3 函数传参
5.3.1 形参
解释:形式参数
def my_len(argv): # 形式参数 ,形参
count = 0
for i in argv:
count += 1
return count
l1 = [1, 2, 3, 4, 5]
# my_len(s) # 实际参数, 实参
print(my_len(l1))
输出
C:\python3\python.exe "D:/python/untitled2/python_3/07 函数的初识.py"
5
5.3.2 实参
u 位置参数 按照顺序一一对应
u 关键字传参 一一对应。
u 混合参数。(位置参数,关键字参数) 关键字参数必须在位置参数后面
u 动态参数。 *args, **kwargs 万能参数
args:所有的位置参数,放在一个元组中。
kwargs:所有的关键字参数,放在一个字典中。
5.3.3 例:位置参数
def func1(a, b, c):
print(a, b, c)
func1(1, 2, 'alex')
输出
C:\python3\python.exe "D:/python/untitled2/python_3/07 函数的初识.py"
1 2 alex
5.3.4 例:关键字参数
def func2(a, b):
print(a, b)
func2(b=2, a=3)
输出
C:\python3\python.exe "D:/python/untitled2/python_3/07 函数的初识.py"
3 2
5.3.5 例:混合参数
def func3(a, b, c, d):
print(a, b, c, d)
func3(1,2,d=3,c=5)
输出
C:\python3\python.exe "D:/python/untitled2/python_3/07 函数的初识.py"
1 2 5 3
5.3.6 例:比较大写输出最大
def max(a, b): return a if a > b else b
ret = 1 if 2 > 1 else 6
print(max(10, 2))
输出
C:\python3\python.exe "D:/python/untitled2/python_3/07 函数的初识.py"
10
5.3.7 例:动态参数
u *args表示单个元素
u **kwargs表示字典
例1)
def func3(*args, **kwargs): #函数的定义的时候 * 代表聚合。
print(args)
print(kwargs)
func3(1, 2, 3, 'alex', c=6, name='wusir', age='21')
输出
C:\python3\python.exe "D:/python/untitled2/python_3/07 函数的初识.py"
(1, 2, 3, 'alex')
{'c': 6, 'name': 'wusir', 'age': '21'}
例2)
def func3(*args, **kwargs): #函数的定义的时候 * 代表聚合。
print(args)
print(kwargs)
func3(*[1, 2, 3],*(22, 33)) #函数的执行的时候 * 代表打散。
输出
C:\python3\python.exe "D:/python/untitled2/python_3/07 函数的初识.py"
(1, 2, 3, 22, 33)
{}
例3)
def func3(*args, **kwargs): #函数的定义的时候 * 代表聚合。
print(args)
print(kwargs)
func3(**{'name':"alex"},**{'age':23}) #函数的执行的时候 * 代表打散。
输出
C:\python3\python.exe "D:/python/untitled2/python_3/07 函数的初识.py"
()
{'name': 'alex', 'age': 23}
例4)
def func3(*args, **kwargs): #函数的定义的时候 * 代表聚合。
print(args)
print(kwargs)
func3(1, 2, 3, 22, 33) #函数的执行的时候 * 代表打散。
输出
C:\python3\python.exe "D:/python/untitled2/python_3/07 函数的初识.py"
(1, 2, 3, 22, 33)
{}
第6章 拾遗
6.1 'is'/'id'/'=='区别
l == 数值比较
l is 比较的是内存地址
l id 测试的是内存地址
6.2 小数据池
解释:在一定范围内的数字或者字符串定义的变量都放在一个内存地址中,节省内存空间
l int: [-5:256]长度都是存放在一个地址池中
l str:不能含有特殊字符;单个元素*int(20)不能超过20;一般情况下设置的字符串变量都在一个小数据池中
例1:涉及内存地址的都在在终端中测试
例2: