文章目录

  • 38.字典dict
  • 38.1 创建字典
  • 38.2 字典获取元素
  • 38.3 key字典
  • 38.4key-value-items键值对
  • 38.5字典的遍历
  • 38.6 哈希函数haxi
  • 39.可变序列与不可变序列
  • 39.1可变序列:列表,字典
  • 39.2不可变序列,字符串,元组
  • 40.元组tuple
  • 40.1创建元组
  • 40.2 元组的不可变性
  • 40.3元组遍历
  • 41.集合set
  • 41.1 创建集合set
  • 41.2 集合的相关操作
  • 41.3集合:交集、并集、差集、堆成差集
  • 41.4 集合生成式
  • 42 字符串
  • 42.1 字符串的驻流机制
  • 42.2 字符串的查询操作
  • 42.3 字符串的大小写转换方法
  • 42.4 字符串对齐方法
  • 42.5 字符串的分割
  • 42.6 判断字符串操作的常用方法
  • 42.7 字符串的比较操作
  • 42.8 字符串的切片操作
  • 42.9 格式化字符串
  • 42.10 字符串的编码
  • 43 函数
  • 43.1 形参和实参
  • 43.2 函数参数传递
  • 43.3 函数的调用
  • 43.4 递归函数
  • 43. 5 斐波那契数列
  • 44 try-except 异常
  • 45异常类型
  • 45.1 ZeroDivisionError
  • 45.2 indexError
  • 45.3 KeyError
  • 45.4 Nameerror
  • 45.5 SyntaxError
  • 45.6 ValueError
  • 46 class
  • 46.1 对象的创建
  • 46.2 类属性、类方法、静态方法的使用
  • 46.3 动态绑定属性和方法
  • 47 封装
  • 47.1 封装的实现方法
  • 47.2 继承
  • 47.3 继承的实现
  • 47.3多态的实现
  • 47.4 特殊属性
  • 47.5 特殊方法
  • 47.6 __new__与__init__创建对象
  • 47.8类的赋值
  • 47.9 深拷贝与浅拷贝
  • 48 模块
  • 48.1什么是模块
  • 48.2模块的导入
  • 48.3 模块定义
  • 48.4导入自己定义的模块
  • 48.5 以主程序方式运行
  • 48.6 python的包
  • 48.7 导入自定义包
  • 48.8 python中常用的内容模块
  • 48.9 安装python包
  • 49 编码
  • 49.1 编码格式
  • 49.2 文件读取
  • 49.2 文件只写模式
  • 49.3 文件追加模式
  • 49.4 二进制打开文件
  • 49.5 上下文管理器
  • 49.6 复制图片
  • 49.7 os模块常用方法


38.字典dict

38.1 创建字典

字典:python内置的数据结构之一,与列表一样,是一个可变序列
以键值对的方式存储数据,字典是一个无序的序列
字典的实现原理
字典的实现原理与查字典类似,python中的字典是根据key查找value所在的位置
常用的创建字典方式

# 字典:python内置的数据结构之一,与列表一样,是一个可变序列
# 以键值对的方式存储数据,字典是一个无序的序列
scores={'张三':100,'李四':200,'王五':300}
# 字典的实现原理
# 字典的实现原理与查字典类似,python中的字典是根据key查找value所在的位置
# 常用的创建字典方式
scores={'张三':100,'李四':200,'王五':300}
print(scores,type(scores) )

student=dict(name='jack',age=20)
print(student,type(student))

# 空字典
d={}
print(d,type(d))

结果

{'张三': 100, '李四': 200, '王五': 300} <class 'dict'>
{'name': 'jack', 'age': 20} <class 'dict'>
{} <class 'dict'>

进程已结束,退出代码0

38.2 字典获取元素

# 字典中获取元素
scores={'张三':100,'李四':200,'王五':300}
# 第一种方式,使用[]
print(scores['张三'])
print('scores[\'老刘\']', '[]方式 如果键不存在的话,会报错')

# 第二种方式,使用get()方法
print(scores.get('张三'))
print(scores.get('老刘'),'get()方式 键不存在的话会输出None')
print(scores.get('麻雀',99),'如果不存在输出默认值99')

结果

100
scores['老刘'] []方式 如果键不存在的话,会报错
100
None get()方式 键不存在的话会输出None
99 如果不存在输出默认值99

进程已结束,退出代码0

38.3 key字典

# key的判断
scores={'张三':100,'李四':200,'王五':300}
print('张三'in scores)
print('张三' not in scores)

del scores['张三']
scores.clear()
print(scores)
print('clear表示清空字典,del删除字典键值对')
scores['陈留']=98
print(scores,'新增键值对')
scores['陈留']=100
print(scores,'修改键值对')

结果

True
False
{}
clear表示清空字典,del删除字典键值对
{'陈留': 98} 新增键值对
{'陈留': 100} 修改键值对

进程已结束,退出代码0

38.4key-value-items键值对

# 获取字典视图
print('keys():获取字典中所有key')
print('value:()获取字典中所有value')
print('items():获取字典中所有key,value对')
scores={'张三':100,'李四':200,'王五':300}
# 获取所有的key
keys=scores.keys()
print(keys,'获取所有的keys',type(keys))
print(list(keys),type(list(keys)),'将所有的keys组成的视图装换为列表')

# 所有的value
values=scores.values()
print(values,type(values),'获取所有的values')
print(list(values),type(list(values)),'将所有的values组成的视图装换为列表')

# 获取所有的key-value对
items=scores.items()
print(items,'获取所有的key-value对')
print(list(items),type(list(items)),'转换之后的列表元素是由元组组成')

结果

keys():获取字典中所有key
value:()获取字典中所有value
items():获取字典中所有key,value对
dict_keys(['张三', '李四', '王五']) 获取所有的keys <class 'dict_keys'>
['张三', '李四', '王五'] <class 'list'> 将所有的keys组成的视图装换为列表
dict_values([100, 200, 300]) <class 'dict_values'> 获取所有的values
[100, 200, 300] <class 'list'> 将所有的values组成的视图装换为列表
dict_items([('张三', 100), ('李四', 200), ('王五', 300)]) 获取所有的key-value对
[('张三', 100), ('李四', 200), ('王五', 300)] <class 'list'> 转换之后的列表元素是由元组组成

进程已结束,退出代码0

38.5字典的遍历

# 字典元素的遍历
scores={'张三':100,'李四':200,'王五':300}

for i in scores:
    print(i,scores.get(i),scores[i],'scores.get(i),scores[i]都是输出字典的值')

结果

张三 100 100 scores.get(i),scores[i]都是输出字典的值
李四 200 200 scores.get(i),scores[i]都是输出字典的值
王五 300 300 scores.get(i),scores[i]都是输出字典的值

进程已结束,退出代码0

38.6 哈希函数haxi

d={'name':'张三','name':'李四'}
print(d,'key键是不可以重复的')

d={'name':'张三','nickname':'张三'}
print(d,'说明字典的value是可以重复的')

lst =[10,20,30]
lst.insert(1,100)
print(lst)
print('字典中的元素是无序的,不可以在任意位置插入元素','字典的key必须是不可变对象','字典也可以根据需要动态地伸缩','字典会浪费较大的内存,是一种使用空间换时间的数据结构')
print('哈希函数haxi')

结果

{'name': '李四'} key键是不可以重复的
{'name': '张三', 'nickname': '张三'} 说明字典的value是可以重复的
[10, 100, 20, 30]
字典中的元素是无序的,不可以在任意位置插入元素 字典的key必须是不可变对象 字典也可以根据需要动态地伸缩 字典会浪费较大的内存,是一种使用空间换时间的数据结构
哈希函数haxi

进程已结束,退出代码0

39.可变序列与不可变序列

39.1可变序列:列表,字典

39.2不可变序列,字符串,元组

'可变序列:列表,字典'
lst=[10,20,50]
print(id(lst))
lst.append(100)
print(id(lst),lst)

'不可变序列,字符串,元组'
s='hello'
print(id(s))
s=s+'world'
print(id(s))
print(s)
print('列表以方括号进行存储,元组以()进行存储')

结果

2599109284232
2599109284232 [10, 20, 50, 100]
2599114381360
2599116461744
helloworld
列表以方括号进行存储,元组以()进行存储

进程已结束,退出代码0

40.元组tuple

40.1创建元组

'元组的创建方式'
print('-'*20,'tuple元组:第一种使用()','-'*20)
t=('python','world',98)
print(t,type(t))

t2='python','world',98
print(t2,type(t2))

t3='python',
print(t3,type(t3),'如果只包含一个元素需要进行加逗号进行分割')

print('-'*20,'tuple元组:第二种使用()','-'*20)
t1=tuple(('python','world',98))
print(t1,type(t1))

print('-'*20,'空列表的创建方式','-'*20)
lst=[]
lst1=list()
print(lst,type(lst))
print(lst1,type(lst1))

print('-'*20,'空字典','-'*20)
d={}
d2=dict()
print(d,d2,type(d),type(d2))

print('-'*20,'空元组','-'*20)
t4=()
t5=tuple()
print(t4,t5,type(t4),type(t5))

print('空列表',lst,lst1)
print('空字典',d,d2)
print('空元组',t4,t5)

结果

-------------------- tuple元组:第一种使用() --------------------
('python', 'world', 98) <class 'tuple'>
('python', 'world', 98) <class 'tuple'>
('python',) <class 'tuple'> 如果只包含一个元素需要进行加逗号进行分割
-------------------- tuple元组:第二种使用() --------------------
('python', 'world', 98) <class 'tuple'>
-------------------- 空列表的创建方式 --------------------
[] <class 'list'>
[] <class 'list'>
-------------------- 空字典 --------------------
{} {} <class 'dict'> <class 'dict'>
-------------------- 空元组 --------------------
() () <class 'tuple'> <class 'tuple'>
空列表 [] []
空字典 {} {}
空元组 () ()

进程已结束,退出代码0

40.2 元组的不可变性

print('为什么要将元组设计成不可变序列')
print('在多任务环境下,同样操作对象时不需要加锁')
print('因此,在程序中尽量使用不可变序列')
print('注意事项')
print('元组中的存储是对象的引用')
print('1.如果元组中对象本身不可变对象,则不能再引入其他对象')
print('2.如果元组中的对象是可变对象,则可变对象的引用不允许改变,但是数据可以改变')

t=(10,[20,30],9)
t1=tuple((10,[20,30],9))
t2=10,[20,30],9
t3=10,[20,30],9,
print(t,t1,t2,t3,type(t),type(t1),type(t2),type(t3),id(t))
print(t[0],t[1],t[2],type(t[0]),type(t[1]),type(t[2]),id(t[1]))
print('尝试将t[1]修改为100',id(t[1]))
# t[1]=100
print('t[1]=100会报错,因为元组不支持修改,不可变对象,不允许修改对象')
print('由于[20,30]列表,而列表是可变序列,所以可以向列表中添加元素,而列表的内存地址不变')
t[1].append(100)
print(t,id(t[1]))

结果

为什么要将元组设计成不可变序列
在多任务环境下,同样操作对象时不需要加锁
因此,在程序中尽量使用不可变序列
注意事项
元组中的存储是对象的引用
1.如果元组中对象本身不可变对象,则不能再引入其他对象
2.如果元组中的对象是可变对象,则可变对象的引用不允许改变,但是数据可以改变
(10, [20, 30], 9) (10, [20, 30], 9) (10, [20, 30], 9) (10, [20, 30], 9) <class 'tuple'> <class 'tuple'> <class 'tuple'> <class 'tuple'> 2582380213016
10 [20, 30] 9 <class 'int'> <class 'list'> <class 'int'> 2582377812360
尝试将t[1]修改为100 2582377812360
t[1]=100会报错,因为元组不支持修改,不可变对象,不允许修改对象
由于[20,30]列表,而列表是可变序列,所以可以向列表中添加元素,而列表的内存地址不变
(10, [20, 30, 100], 9) 2582377812360
进程已结束,退出代码0

40.3元组遍历

print('元组的遍历')

t=('python','world',98)
print(t[0],t[1],t[2])
# print(t[3])     IndexError: tuple index out of range
print('遍历元祖')
for item in t:
    print(item)

结果

元组的遍历
python world 98
遍历元祖
python
world
98

进程已结束,退出代码0

41.集合set

41.1 创建集合set

print('集合','python语言中提供的内置数据结构','与列表、字典一样都属于可变数据类型的序列','集合斯没有value的字典')
print('-'*20,'第一种创建方式{}','-'*20)
s={664,2,3,4,0,5,6,78,9,7,2,3,5,7}
print(s,'集合不能重复')

print('-'*20,'第二种创建方式set(range())','-'*20)
s1=set(range(6))
print(s1,type(s1))

print('-'*20,'第三种创建方式set([ ])','-'*20)
s2=set([1,2,4,5,5,6,6,7,8,9,1,5])
print(s2,type(s2))

print('-'*20,'第四种创建方式set(元组)','-'*20)
s3=set((1,2,3,44,4,4,44,5,674))
print(s3,type(s3),'集合中的元素是无序的')

s4=set('python')
print(s4,type(s4))

s5=set({12,4,65,48,67,45,1,4,2})
print(s5,type(s5))

print('定义一个空集合')
s6={}
print(type(s6),'这样不可以定义一个空集合,这样成了字典类型')

s7=set()
print(type(s7),'这样的类型才是集合set')

结果

集合 python语言中提供的内置数据结构 与列表、字典一样都属于可变数据类型的序列 集合斯没有value的字典
-------------------- 第一种创建方式{} --------------------
{0, 2, 3, 4, 5, 6, 7, 9, 78, 664} 集合不能重复
-------------------- 第二种创建方式set(range()) --------------------
{0, 1, 2, 3, 4, 5} <class 'set'>
-------------------- 第三种创建方式set([ ]) --------------------
{1, 2, 4, 5, 6, 7, 8, 9} <class 'set'>
-------------------- 第四种创建方式set(元组) --------------------
{1, 2, 3, 4, 5, 674, 44} <class 'set'> 集合中的元素是无序的
{'t', 'h', 'n', 'p', 'y', 'o'} <class 'set'>
{65, 1, 67, 4, 2, 12, 45, 48} <class 'set'>
定义一个空集合
<class 'dict'> 这样不可以定义一个空集合,这样成了字典类型
<class 'set'> 这样的类型才是集合set

进程已结束,退出代码0

41.2 集合的相关操作

print('集合的相关操作')

s={10,20,30,40,5,106,0}
print(s)
print('-'*50,'集合元素的判断操作','-'*50)
print(10 in s,100 in s,10 not in s,100 not in s)

print('-'*50,'集合元素的新增操作','-'*50)
s.add(100)
print(s,'add()添加元素功能(单个元素)')
s.update({200,300,740})
print(s,'update()增加多个元素')
s.update([1000,6,0,46,2])
s.update((105,8,5,6))
print(s)

print('-'*50,'集合元素的删除操作','-'*50)
s.remove(1000)
print(s)
# s.remove(500)
print(s,'s.remove(500)如果指定元素存在则删除,不存在则会报错')
s.discard(500)
print(s,'s.discard(500)如果指定元素存在则删除,不存在不报错')
s.pop()
print(s,'s.pop()删除指定元素,不能添加参数')
# s.clear()
print(s,'# s.clear()清空所有元素')

结果

集合的相关操作
{0, 5, 40, 10, 106, 20, 30}
-------------------------------------------------- 集合元素的判断操作 --------------------------------------------------
True False False True
-------------------------------------------------- 集合元素的新增操作 --------------------------------------------------
{0, 100, 5, 40, 10, 106, 20, 30} add()添加元素功能(单个元素)
{0, 100, 5, 740, 40, 200, 10, 106, 300, 20, 30} update()增加多个元素
{0, 2, 100, 5, 740, 6, 40, 200, 10, 106, 300, 1000, 46, 105, 8, 20, 30}
-------------------------------------------------- 集合元素的删除操作 --------------------------------------------------
{0, 2, 100, 5, 740, 6, 40, 200, 10, 106, 300, 46, 105, 8, 20, 30}
{0, 2, 100, 5, 740, 6, 40, 200, 10, 106, 300, 46, 105, 8, 20, 30} s.remove(500)如果指定元素存在则删除,不存在则会报错
{0, 2, 100, 5, 740, 6, 40, 200, 10, 106, 300, 46, 105, 8, 20, 30} s.discard(500)如果指定元素存在则删除,不存在不报错
{2, 100, 5, 740, 6, 40, 200, 10, 106, 300, 46, 105, 8, 20, 30} s.pop()删除指定元素,不能添加参数
{2, 100, 5, 740, 6, 40, 200, 10, 106, 300, 46, 105, 8, 20, 30} # s.clear()清空所有元素

进程已结束,退出代码0

41.3集合:交集、并集、差集、堆成差集

print('集合的数学操作')

print('交集')
s1={10,20,30,40}
s2={20,30,40,50,60}
print(s1.intersection(s2))
print(s1 & s2,'intersection与&是等价的')

print('并集操作')
print(s1.union(s2))
print(s1 | s2,'union与 | 等价,并集操作')
print(s1,s2,'并集操作元集合不发生变化')

print('差集操作')
print(s1.difference(s2))
print(s1-s2,'difference与 - 是相同的')
print(s1,s2,'差集操作元集合不发生变化')

print('对称差集')
print(s1.symmetric_difference(s2))
print(s1^s2,'symmetric_difference与 ^是等价的')

结果

集合的数学操作
交集
{40, 20, 30}
{40, 20, 30} intersection与&是等价的
并集操作
{40, 10, 50, 20, 60, 30}
{40, 10, 50, 20, 60, 30} union与 | 等价,并集操作
{40, 10, 20, 30} {40, 50, 20, 60, 30} 并集操作元集合不发生变化
差集操作
{10}
{10} difference与 - 是相同的
{40, 10, 20, 30} {40, 50, 20, 60, 30} 差集操作元集合不发生变化
对称差集
{50, 10, 60}
{50, 10, 60} symmetric_difference与 ^是等价的

进程已结束,退出代码0

41.4 集合生成式

print('列表生成式')
lst=[i*i for i in range(100)]
print(lst)

print('集合生成式')
s= { i*i for i in range(100)}
print(s)

结果

列表生成式
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, 1444, 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304, 2401, 2500, 2601, 2704, 2809, 2916, 3025, 3136, 3249, 3364, 3481, 3600, 3721, 3844, 3969, 4096, 4225, 4356, 4489, 4624, 4761, 4900, 5041, 5184, 5329, 5476, 5625, 5776, 5929, 6084, 6241, 6400, 6561, 6724, 6889, 7056, 7225, 7396, 7569, 7744, 7921, 8100, 8281, 8464, 8649, 8836, 9025, 9216, 9409, 9604, 9801]
集合生成式
{0, 1, 1024, 4096, 4, 9216, 9, 16, 529, 3600, 4624, 25, 36, 2601, 49, 7225, 3136, 64, 576, 1089, 1600, 2116, 5184, 6724, 7744, 9801, 81, 8281, 6241, 100, 625, 121, 4225, 1156, 8836, 3721, 144, 1681, 2704, 5776, 4761, 2209, 676, 169, 3249, 9409, 196, 1225, 5329, 729, 225, 1764, 7396, 6889, 7921, 2809, 256, 2304, 6400, 3844, 4356, 784, 1296, 8464, 289, 3364, 4900, 5929, 1849, 9025, 324, 841, 1369, 2401, 2916, 5476, 361, 3969, 900, 9604, 4489, 400, 1936, 7056, 7569, 3481, 6561, 1444, 8100, 5041, 441, 961, 2500, 6084, 8649, 3025, 484, 2025, 1521, 5625}

进程已结束,退出代码0

42 字符串

42.1 字符串的驻流机制

print('字符串的驻流机制')

a='python'
b="python"
c="""python"""
d='''python'''
print(a,b,c,d,id(a),id(b),id(c),id(d))
print('''仅保存一份相同且不可变字符串的方法,
不同的值被存放在字符串的驻留池中,
python的驻留机制对相同的字符串只保留一份拷贝,
后续创建相同的字符串时不会开辟新空间,
而是把该字符串的地址付给新创建的变量''')
print()

print('''驻留机制的几种情况(交互模式):
字符串的长度为0或者1时;
符合标识符的字符串;
字符串只在编译时进行驻留,而非运行时;
[-5,256]之间的整数数字''')
s1 ='abc%'
s2='abc%'
print(s1 is s2,'False,在python中运行')
import sys
s1=sys.intern(s2)
print(s1 is s2)

print('''sys中的intern方法强制2个字符串指向同一个对象,pycharm对字符串进行了优化处理,所以不用pycharm''')

结果

字符串的驻流机制
python python python python 3064662398448 3064662398448 3064662398448 3064662398448
仅保存一份相同且不可变字符串的方法,
不同的值被存放在字符串的驻留池中,
python的驻留机制对相同的字符串只保留一份拷贝,
后续创建相同的字符串时不会开辟新空间,
而是把该字符串的地址付给新创建的变量

驻留机制的几种情况(交互模式):
字符串的长度为0或者1时;
符合标识符的字符串;
字符串只在编译时进行驻留,而非运行时;
[-5,256]之间的整数数字
True False,在python中运行
True
sys中的intern方法强制2个字符串指向同一个对象,pycharm对字符串进行了优化处理,所以不用pycharm

进程已结束,退出代码0

42.2 字符串的查询操作

print('字符串的查询操作')

s='hello,hello'
print(s.index('lo'),'如果不存在会报错')
print(s.find('lo'),'如果不存在不会报错')
print(s.rindex('lo'),'如果不存在会报错')
print(s.rfind('lo'),'如果不存在不会报错')
print(s.find('k'))
print(s.find('e'))

结果

字符串的查询操作
3 如果不存在会报错
3 如果不存在不会报错
9 如果不存在会报错
9 如果不存在不会报错
-1
1

进程已结束,退出代码0

42.3 字符串的大小写转换方法

print('字符串的大小写转换方法')
print('''upper()把字符串中所有字符都转成大写字母;
lower()把字符串中所有字符都转成小写字母;
swapcase()把字符串中所有大写字母转换成小写字母,把所有小写字母转换成大写字母;
capitalize()把第一个字符转换成大写,把其余字符转换成小写;
title()把每个单词的第一个字符转换成大写,把每个单词的剩余字符转换成小写
''')

s='hello world python'
a=s.upper()
print(s,a,id(s),id(a),'upper把字符串中所有字符都转成大写字母:转换之后,会产生一个新的字符串对象')
b=s.lower()
print(s,b,id(s),id(b),'lower把字符串中所有字符都转成小写字母:转换之后的字符串对象不一样')
print(s==b,s is b,'说明他们的内容是相等的、地址是不相等,没有驻留')
c=s.swapcase()
print(s,c,id(s),id(c),'swapcase把字符串中所有大写字母转换成小写字母,把所有小写字母转换成大写字母:字符串对象不一样')

print(s.title(),'title()把每个单词的第一个字符转换成大写,把每个单词的剩余字符转换成小写')

结果

字符串的大小写转换方法
upper()把字符串中所有字符都转成大写字母;
lower()把字符串中所有字符都转成小写字母;
swapcase()把字符串中所有大写字母转换成小写字母,把所有小写字母转换成大写字母;
capitalize()吧第一个字符转换成大写,把其余字符转换成小写;
title()把每个单词的第一个字符转换成大写,把每个单词的剩余字符转换成小写

hello world python HELLO WORLD PYTHON 2569941913808 2569941580736 upper把字符串中所有字符都转成大写字母:转换之后,会产生一个新的字符串对象
hello world python hello world python 2569941913808 2569942016768 lower把字符串中所有字符都转成小写字母:转换之后的字符串对象不一样
True False 说明他们的内容是相等的、地址是不相等,没有驻留
hello world python HELLO WORLD PYTHON 2569941913808 2569943743184 swapcase把字符串中所有大写字母转换成小写字母,把所有小写字母转换成大写字母:字符串对象不一样
Hello World Python title()把每个单词的第一个字符转换成大写,把每个单词的剩余字符转换成小写

进程已结束,退出代码0

42.4 字符串对齐方法

print('字符串内容对其操作的方法')

print('''center()居中对齐
ljust()左对齐
rjust()右对齐
zfill()右对齐''')

s='hello,Python'
s1=s.center(20,'*')
print(s1,'center()居中对齐,默认空格')
s2=s.ljust(20,'*')
print(s2,'ljust()左对齐,默认空格,如果格数小于字符串数量就不用补空格')
s3=s.rjust(20,'*')
print(s3,'rjust()右对齐')
s4=s.zfill(20)
print(s4,'zfill()右对齐:用0进行填充')

print('-8910'.zfill(8))

结果

字符串内容对其操作的方法
center()居中对齐
ljust()左对齐
rjust()右对齐
zfill()右对齐
****hello,Python**** center()居中对齐,默认空格
hello,Python******** ljust()左对齐,默认空格,如果格数小于字符串数量就不用补空格
********hello,Python rjust()右对齐
00000000hello,Python zfill()右对齐:用0进行填充
-0008910

进程已结束,退出代码0

42.5 字符串的分割

print('字符串的分割')
s='hello world Python'
lst=s.split()
print(lst)
s1='hello|world|Python'
print(s1.split(),'按空格进行切分')
print(s1.split(sep='|'),'按|进行切分')
print(s1.split(sep='|'),'sep参数按|进行切分')
print(s1.split(sep='|',maxsplit=1),'按|进行切分,maxsplit表示最大分成几段')

print(s.rsplit())
print(s1.rsplit('1'))
print(s1.rsplit(sep='|',maxsplit=1),'rsplit()从右侧开始切分')

结果

字符串的分割
['hello', 'world', 'Python']
['hello|world|Python'] 按空格进行切分
['hello', 'world', 'Python'] 按|进行切分
['hello', 'world', 'Python'] sep参数按|进行切分
['hello', 'world|Python'] 按|进行切分,maxsplit表示最大分成几段
['hello', 'world', 'Python']
['hello|world|Python']
['hello|world', 'Python'] rsplit()从右侧开始切分

进程已结束,退出代码0

42.6 判断字符串操作的常用方法

print('判断字符串操作的常用方法')
print('-'*20,'isidentifier()判断指定的字符串是不是合法的标识符','-'*20)
s='hello ,python'
print('1',s.isidentifier())
print('2','hello'.isidentifier())
print('3','张三_'.isidentifier())
print('4','张三_123'.isidentifier())

print('5','\t'.isspace(),'isspace()判断指定的字符串是否全部由空白字符组成(回车、换行,水平制表符)')

print('6','abc'.isalpha(),'isalpha()判断指定的字符串是否全部由字母组成')
print('7.','张三'.isalpha())
print('8.','张三1'.isalpha())

print('9','123'.isdecimal(),'isdecimal()判断指定字符串是否全部由十进制数字组成')
print('10','123四'.isdecimal())


print('12.','456'.isnumeric(),'isnumeric()判断指定的字符串是否全部由数字组成')
print('13.','123四'.isnumeric())

# isalnum()判断指定的字符串是否全部由字母和数字组成
print('15','abc1'.isalnum(),'isalnum()判断指定的字符串是否全部由字母和数字组成')
print('16','张三123'.isalnum())

结果

判断字符串操作的常用方法
-------------------- isidentifier()判断指定的字符串是不是合法的标识符 --------------------
1 False
2 True
3 True
4 True
5 True isspace()判断指定的字符串是否全部由空白字符组成(回车、换行,水平制表符)
6 True isalpha()判断指定的字符串是否全部由字母组成
7. True
8. False
9 True isdecimal()判断指定字符串是否全部由十进制数字组成
10 False
12. True isnumeric()判断指定的字符串是否全部由数字组成
13. True
15 True isalnum()判断指定的字符串是否全部由字母和数字组成
16 True

进程已结束,退出代码0

42.7 字符串的比较操作

print('字符串的比较操作')

print('apple'>'app')
print('apple'>'balance')
print(ord('a'),ord('b'))
print(ord('杨'))

print('==与is的区别:==比较的是value,is比较的是id是否相等')
a=b='python'
c='python'
print(a==b,b==c,a is b,a is c,id(a),id(b),id(c))

结果

字符串的比较操作
True
False
97 98
26472
==与is的区别:==比较的是value,is比较的是id是否相等
True True True True 1158283438192 1158283438192 1158283438192

进程已结束,退出代码0

42.8 字符串的切片操作

print('字符串的切片操作')

print('字符串时不可变类型:不具备增、删、改等操作;切片操作将产生新的对象')
print('切片后产生新的操作对象')

s='hello,Python'
s1=s[:5]
s2=s[6:]
print(s1,s2)
print(s1+'!'+s2)
print(id(s),id(s1),id(s2))
print('-'*20,'[start;end:step]','-'*20)
print(s[1:5:1],'从1到5不包含5,步长为1')
print(s[::2],'默认从0到最后一个元素,步长为2')
print(s[1:5:],'从1到5结束,默认步长为1')
print(s[::-1],'默认从最后一个开始到第一个')
print(s[-6::1],'从-6开始到最后一个元素结束,默认步长为1')

结果

字符串的切片操作
字符串时不可变类型:不具备增、删、改等操作;切片操作将产生新的对象
切片后产生新的操作对象
hello Python
hello!Python
2454151239664 2454153330800 2454150911472
-------------------- [start;end:step] --------------------
ello 从1到5不包含5,步长为1
hloPto 默认从0到最后一个元素,步长为2
ello 从1到5结束,默认步长为1
nohtyP,olleh 默认从最后一个开始到第一个
Python 从-6开始到最后一个元素结束,默认步长为1

进程已结束,退出代码0

42.9 格式化字符串

print('格式化字符串')
print('''格式化字符串三种方法
1.  %   
2.  format
3.  f
''')
name='张三'
age=20
print('我叫%s,今年%d岁' % (name,age))
print('我叫{0},今年{1}岁'.format(name,age))
print(f'我叫{name},今年{age}岁')

结果

格式化字符串
格式化字符串三种方法
1.  %   
2.  format
3.  f

我叫张三,今年20岁
我叫张三,今年20岁
我叫张三,今年20岁

进程已结束,退出代码0
print('%10d' % 99,'%d表示宽度')
print('%.2f' % 3.1415926,'%f表示保留几位有效小数,3表示小数点后三位')
print('%10.3f' % 3.1415926,'10表示总宽度为10,小数点位后三位')
print('helloworld')

结果

99 %d表示宽度
3.14 %f表示保留几位有效小数,3表示小数点后三位
     3.142 10表示总宽度为10,小数点位后三位
helloworld

进程已结束,退出代码0
print('{0:.3}'.format(3.1415926),'表示一共是三位数')
print('{0:.3f}'.format(3.1415926),'表示一共是三位小数,0可以省略')
print('{0:10.3}'.format(3.1415926),'表示宽度为10,三位小数')

结果

3.14 表示一共是三位数
3.142 表示一共是三位小数,0可以省略
      3.14 表示宽度为10,三位小数

进程已结束,退出代码0

42.10 字符串的编码

print('字符串的编码转换:编码将字符串转换为二进制数据(bytes),解码将bytes类型数据转换为字符串类型数据')
s='天涯共此时'
print('编码')
print(s.encode(encoding='GBK'),'在GBK这种编码格式中,一个中文占两个字节')
print(s.encode(encoding='UTF-8'),'在UTF-8这种编辑格式中,一个中文占三个字节')

print('解码')
print('byte代表就是一个二进制数据(字节类型的数据)')
byte=s.encode(encoding='GBK')
print(byte.decode(encoding="GBK"))

byte1=s.encode(encoding='UTF-8')
print(byte1.decode(encoding="UTF-8"),'用什么编码就得用什么解码') # 用什么编码就得用什么解码

结果

字符串的编码转换:编码将字符串转换为二进制数据(bytes),解码将bytes类型数据转换为字符串类型数据
编码
b'\xcc\xec\xd1\xc4\xb9\xb2\xb4\xcb\xca\xb1' 在GBK这种编码格式中,一个中文占两个字节
b'\xe5\xa4\xa9\xe6\xb6\xaf\xe5\x85\xb1\xe6\xad\xa4\xe6\x97\xb6' 在UTF-8这种编辑格式中,一个中文占三个字节
解码
byte代表就是一个二进制数据(字节类型的数据)
天涯共此时
天涯共此时 用什么编码就得用什么解码

进程已结束,退出代码0

43 函数

43.1 形参和实参

def calc(a,b): # a,b称为形式参数,简称形参,形参的位置在函数的定义处
    c=a+b
    return c
result=calc(1,2) #1,2称为实际参数的值,简称为实参,实参的位置是函数的调用处
print(result)

res=calc(b=10,a=20)     #=左边的变量的名称称为 关键字参数
print(res)

结果

3
30

进程已结束,退出代码0

43.2 函数参数传递

print('函数参数传递')
def fun(arg1,arg2):
    print('arg1=',arg1)
    print('arg2=',arg2)
    arg1=100
    arg2.append(10)
    print('arg1',arg1)
    print('arg2',arg2)

n1=11
n2=[22,33,44]

fun(n1,n2)  #将位置传参,arg1与argue2是函数定义处的形参,n1,n2是函数调用处的实参。总结:实参名称与形参名称可以不一致

'''在函数调用过程中,进行参数的传递
如果是不可变对象,在函数体的修改不会影响实参的值
如果是可变对象,在函数体的修改会影响到实参的值'''

结果

函数参数传递
arg1= 11
arg2= [22, 33, 44]
arg1 100
arg2 [22, 33, 44, 10]

进程已结束,退出代码0
def fun(num):
    odd= []
    even=[]
    for i in num:
        if i%2:
            odd.append(i)
        else:
            even.append(i)
    return odd,even
lst=[10,24,32,54,85,78,82,77,44,553]
print(fun(lst))

print('''函数返回值
(1)如果函数没有返回值,函数自行完毕之后,不需要给调用处提供数据,return可以省略不写
(2)函数的返回值,如果是1个,直接返回类型
(3)函数的返回值,如果是多个,返回的结果是元组''')
def fun1():
    print('hello')

fun1()


def fun2():
    return 'hello'

res=fun2()
print(res)

def fun3():
    return 'hello','world'
print(fun3())

print('函数在定义时,是否需要返回值,视情况而定')

结果

([85, 77, 553], [10, 24, 32, 54, 78, 82, 44])
函数返回值
(1)如果函数没有返回值,函数自行完毕之后,不需要给调用处提供数据,return可以省略不写
(2)函数的返回值,如果是1个,直接返回类型
(3)函数的返回值,如果是多个,返回的结果是元组
hello
hello
('hello', 'world')
函数在定义时,是否需要返回值,视情况而定

进程已结束,退出代码0

43.3 函数的调用

def fun(a,b=10):
    print(a,b)

# 函数的调用
fun(100)
fun(20,30)

结果

100 10
20 30

进程已结束,退出代码0
def fun(*args): # 函数定义时的可变位置参数
    print(args)

fun(10)
fun(10,30)
fun(30,40,50)

def fun1(**args):
    print(args)

fun1(a=10)
fun1(a=20,b=20,c=30)

'''def dun2(*args,*a):
    pass
    以上代码,程序会报错,个数可变的位置参数只能是1个
    def fun2(**args,**args):
    pass
    以上代码,程序会报错,个数可变的关键字参数,只能是一个
    '''
def fun2(*args1,**args2):
    pass
# def fun3(**args1,*args2):
#     pass
# 在一个函数的定义过程中,既有个数可变的关键字形参,也有个数可变的位置形参,要求啊个数可变的位置形参,放在个数可变的关键字形参之前

结果

(10,)
(10, 30)
(30, 40, 50)
{'a': 10}
{'a': 20, 'b': 20, 'c': 30}

进程已结束,退出代码0
def fun(a,b,c):
    print('a=',a)
    print('b=',b)
    print('c=',c)

# 函数的调用
fun(10,20,30) #函数调用时的参数传递,称为位置传参
lst=[11,22,33]
fun(*lst) #在函数调用时,将列表中的每个元素都转换为位置传入实参
fun(a=100,b=300,c=200)#函数的调用,所以是关键字实参
dic={'a':111,'b':222,'c':333}
fun(**dic) #在函数调用时,将字典中的键值对都进行转换为关键字实参传入

结果

a= 10
b= 20
c= 30
a= 11
b= 22
c= 33
a= 100
b= 300
c= 200
a= 111
b= 222
c= 333

进程已结束,退出代码0
def fun(a,b=10):
    print('a=',a)
    print('b=',b)


def fun2(*args):
    print(args)

def fun3(**args2):
    print(args2)

fun2(10,20,30,40,50,60)
fun3(a=22,b=22,c=33)

def fun4(a,b,c,d):
    print('a=',a)
    print('b=',b)
    print('c=',c)
    print('d=',d)

fun4(10,30,20,50) #位置实参传递
fun4(a=10,b=20,c=30,d=40)#关键字实参传递
fun4(10,20,c=30,d=40)#前两个参数采用位置实参传递,c和d采用关键字实参传递

结果

(10, 20, 30, 40, 50, 60)
{'a': 22, 'b': 22, 'c': 33}
a= 10
b= 30
c= 20
d= 50
a= 10
b= 20
c= 30
d= 40
a= 10
b= 20
c= 30
d= 40

进程已结束,退出代码0
def fun(a,b):
    c=a+b   # c就称为局部变量,因为c在函数体内进行定义的变量。a,b为函数的形参,作用范围也是函数的内部,相当于局部变量
    print(c)
fun(1,2)
# print(c) # 因为c是局部变量,超出了起作用的范围

name='111'
print(name)
def fun2():
    print(name)
# 调用函数
fun2()

def fun3():
    global age      #函数内部定义的变量是局部变量,局部变量使用global声明,这个变量实际上变成了全局变量
    age =20
    print(age)
fun3()
print(age)

结果

3
111
111
20
20

进程已结束,退出代码0

43.4 递归函数

# 递归函数:如果在一个函数的函数体内调用了该函数本身,这个函数就称为递归函数
# 递归函数的组成
def fac(n):
    if n==1:
        return 1
    else:
        return n*fac(n-1)
# a=int(input())
a=int(input('请输入阶乘数:'))
# a=5
print(fac(a))
# 阶乘的计算:递归函数

结果

请输入阶乘数:10
3628800

进程已结束,退出代码0

43. 5 斐波那契数列

def fib(n): #
    if  n==1:
        return 1
    elif n==2:
        return 1
    else:
        return fib(n-1)+fib(n-2)

a=int(input('请输入斐波那契数列第几位上的数字:'))
print(fib(a))

for i in range(1,7):
    print(fib(i))

结果

请输入斐波那契数列第几位上的数字:6
8
1
1
2
3
5
8

进程已结束,退出代码0

44 try-except 异常

可以将错误进行打印输出

try:
    a=int(input('请输入第一个整数:'))
    b=int(input('请输入第二个整数:'))
    result=a/b
except BaseException as e:
    print('出错了',e)
else:
    print('计算结果为:',result)
finally:
    print('谢谢您的使用')

结果

请输入第一个整数:12
请输入第二个整数:5.5
出错了 invalid literal for int() with base 10: '5.5'
谢谢您的使用

进程已结束,退出代码0
import traceback
try:
    print('-'*20)
    print(1/0)
except:
    traceback.print_exc()

结果

--------------------
Traceback (most recent call last):
  File "C:/Users/PC/Desktop/pycode/代码/马士兵-人工智能python基础/chap11/demo3.py", line 10, in <module>
    print(1/0)
ZeroDivisionError: division by zero

进程已结束,退出代码0

45异常类型

45.1 ZeroDivisionError

45.2 indexError

45.3 KeyError

45.4 Nameerror

45.5 SyntaxError

45.6 ValueError

# 异常类型
# ZeroDivisionError()除(或取模)零(所有数据类型)
# print(10/0) #数学运算异常

# indexError序列中没有此索引(index)
lst=[11,22,33,44]
# print(lst[4])

# KeyError映射中没有这个键
dic={'name':'张三','age':20}
# print(dic['gander'])

# Nameerror未声明/初始化对象(没有属性)
# print(num)

# SyntaxError  python语法错误
# int a=20

# ValueError  传入无效的参数
# a=int('hello')

46 class

46.1 对象的创建

class Student:  #Student为类的名称(类别),由一个或者多个单词组成,每个单词的首字母大写,其余小写
    pass

print(id(Student))
print(type(Student))
print(Student)

结果

2505172989768
<class 'type'>
<class '__main__.Student'>

进程已结束,退出代码0

46.2 类属性、类方法、静态方法的使用

普通方法传入的第一个参数必须是self(当然也可以不用self,官方要求尽量用self),self是指实例对象本身;
静态方法无需传参;
类方法传入的第一个参数必须是class,是指类本身。

class Student:
    native_pace='吉安'   #直接写在类里的变量,称为类属性
    def __init__(self,name,age):
        self.name=name   #self.name称为实体属性,进行了一个赋值的操作,将局部变量的name的值赋值给了实体变量
        self.age=age
    def eat(self):
        print('学生')

        # 静态方法
    @staticmethod
    def method():
        print('我使用staticmethod进行修饰,所以我是静态方法')
    # 类方法
    @classmethod
    def cm(cls):
        print('我是类方法,因为我使用了classmethod进行修饰')
print('在类之外定义称为函数,在类之内定义的称为方法')
def drink():
    print('喝水')

# 创建Student类的对象
stu1=Student('张三',20)
print(id(Student),type(Student),Student)    #Student是类的名称
print(id(stu1),type(stu1),stu1)

结果

在类之外定义称为函数,在类之内定义的称为方法
1801531955688 <class 'type'> <class '__main__.Student'>
1801541807432 <class '__main__.Student'> <__main__.Student object at 0x000001A374426D48>

进程已结束,退出代码0
class Student:
    native_pace='吉安'   #直接写在类里的变量,称为类属性
    def __init__(self,name,age):
        self.name=name   #self.name称为实体属性,进行了一个赋值的操作,将局部变量的name的值赋值给了实体变量
        self.age=age
    def eat(self):
        print('学生')

        # 静态方法
    @staticmethod
    def method():
        print('我使用staticmethod进行修饰,所以我是静态方法')
    # 类方法
    @classmethod
    def cm(cls):
        print('我是类方法,因为我使用了classmethod进行修饰')
print('在类之外定义称为函数,在类之内定义的称为方法')
def drink():
    print('喝水')

# 创建Student类的对象
stu1=Student('张三',20)
stu1.eat()  #对象名.方法名
print(stu1.age,stu1.name)   # 调用类的方法
Student.eat(stu1)   # 都是调用Student中的eat方法

结果

在类之外定义称为函数,在类之内定义的称为方法
学生
20 张三
学生

进程已结束,退出代码0

46.3 动态绑定属性和方法

class Student:
    native_pace='吉安'   #直接写在类里的变量,称为类属性
    def __init__(self,name,age):
        self.name=name   #self.name称为实体属性,进行了一个赋值的操作,将局部变量的name的值赋值给了实体变量
        self.age=age
    def eat(self):
        print('学生')

        # 静态方法
    @staticmethod
    def method():
        print('我使用staticmethod进行修饰,所以我是静态方法')
    # 类方法
    @classmethod
    def cm(cls):
        print('我是类方法,因为我使用了classmethod进行修饰')

# 类属性的使用方法
print(Student.native_pace)
stu1=Student('张三',20)
stu2=Student('李四',30)
print(stu1.native_pace)
print(stu2.native_pace)
Student.native_pace='天津'
print(stu1.native_pace)
print(stu2.native_pace)

print('类方法的使用方式')
Student.cm()

print('静态方法的使用方式')
Student.method()
吉安
吉安
吉安
天津
天津
类方法的使用方式
我是类方法,因为我使用了classmethod进行修饰
静态方法的使用方式
我使用staticmethod进行修饰,所以我是静态方法

进程已结束,退出代码0

47 封装

47.1 封装的实现方法

class Car:
    def __init__(self,brand):
        self.brand=brand
    def start(self):
        print('汽车')

car=Car('宝马X5')
car.start()
print(car.brand)

结果

汽车
宝马X5

进程已结束,退出代码0
class Student:
    def __init__(self,name,age):
        self.name=name
        self.__age=age      #年龄不希望在类的外部被使用,所以加了两个_
    def show(self):
        print(self.name,self.__age)

stu=Student('张三',20)
stu.show()
# 在类的外部使用name和age
print(stu.name)
# print(stu.__age)
# print(dir(stu))
print(stu._Student__age)

结果

张三 20
张三
20

进程已结束,退出代码0

47.2 继承

print('继承')
class Person(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def info(self):
        print(self.name,self.age)

class Student(Person):
    def __init__(self,name,age,stu_no):
        super().__init__(name,age)
        self.stu_no=stu_no
    def info(self):
        super().info()
        print(self.stu_no)

class Teacher(Person):
    def __init__(self,name,age,teachofyear):
        super().__init__(name,age)
        self.teachofyear=teachofyear
    def info(self):
        # print(self.name,self.age)
        super().info()
        print('教龄',self.teachofyear)

stu=Student('张三',20,'1001')

teacher=Teacher('李四',34,10)

stu.info()
teacher.info()

结果

继承
张三 20
1001
李四 34
教龄 10

进程已结束,退出代码0

47.3 继承的实现

class Student:
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __str__(self):
        return '我的名字是{0},今年{1}岁'.format(self.name,self.age)
stu=Student('张三',20)
print(dir(stu))
print(stu)      #默认调用__str__()这样的方法
print(type(stu))

结果

['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'name']
我的名字是张三,今年20岁
<class '__main__.Student'>

进程已结束,退出代码0

47.3多态的实现

print('''
多态:
简单的说,多态就是“具有多种形态”,它指的是:即便不知道一个变量所引用的对象到底是什么类型,
仍然可以通过这个变量调用方法,
在运行过程中根据变量所引用的对象类型,
动态决定调用哪个对象中的方法
''')

class Animal(object):
    def eat(self):
        print('动物要吃肉')
class Dog(Animal):
    def eat(self):
        print('狗吃肉')
class Cat(Animal):
    def eat(self):
        print('猫吃鱼')
class Person(object):
    def eat(self):
        print('人吃五谷杂粮')

def fun(animal):
    animal.eat()

fun(Dog())
fun(Cat())
fun(Person())

结果

多态:
简单的说,多态就是“具有多种形态”,它指的是:即便不知道一个变量所引用的对象到底是什么类型,
仍然可以通过这个变量调用方法,
在运行过程中根据变量所引用的对象类型,
动态决定调用哪个对象中的方法

狗吃肉
猫吃鱼
人吃五谷杂粮

进程已结束,退出代码0
class Animal(object):
    def eat(self):
        print('动物会吃')

class Dog(Animal):
    def eat(self):
        print('狗吃骨头')

class Cat(Animal):
    def eat(self):
        print('猫吃鱼')

class Person:
    def eat(self):
        print('人吃五谷杂粮')

# 定义一个函数
def fun(obj):
    obj.eat()

# 开始调用函数
fun(Cat())
fun(Dog())
fun(Animal())

fun(Person())

结果

猫吃鱼
狗吃骨头
动物会吃
人吃五谷杂粮

进程已结束,退出代码0

47.4 特殊属性

print('''
特殊方法和特殊属性:
特殊属性:
__dict__:获得类对象或者实例对象所绑定的所有类似和方法的字典
特殊方法:
__len__():通过重写__len__()方法,让内置函数len()的参数可以是自定义类型
__add__():通过重写__add__()方法,可使用自动以对象具有“+”功能
__new__():用于创建对象
__init__():对创建对象进行初始化
''')
# print(dir(object))

class A:
    pass
class B:
    pass
class C(A,B):
    def __init__(self,name,age):
        self.name=name
        self.age=age
# 创建C类对象
x=C('Jack',20) # x是C类型的一个实例对象
print(x.__dict__)  #实例对象的数学字典
print(C.__dict__)
print(x.__class__,'输出了对象所属的类别')
print(C.__bases__,'C类的父类类型的元素')
print(C.__base__,'输出最近的父类')
print(C.__mro__,'查看类的层次结构')
print(A.__subclasses__(),'子类的列表')

结果

特殊方法和特殊属性:
特殊属性:
__dict__:获得类对象或者实例对象所绑定的所有类似和方法的字典
特殊方法:
__len__():通过重写__len__()方法,让内置函数len()的参数可以是自定义类型
__add__():通过重写__add__()方法,可使用自动以对象具有“+”功能
__new__():用于创建对象
__init__():对创建对象进行初始化

{'name': 'Jack', 'age': 20}
{'__module__': '__main__', '__init__': <function C.__init__ at 0x000002D3D0E82AF8>, '__doc__': None}
<class '__main__.C'> 输出了对象所属的类别
(<class '__main__.A'>, <class '__main__.B'>) C类的父类类型的元素
<class '__main__.A'> 输出最近的父类
(<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>) 查看类的层次结构
[<class '__main__.C'>] 子类的列表

进程已结束,退出代码0

47.5 特殊方法

a=20
b=100
c=a+b # 两个整数类型的对象相加操作
d=a.__add__(b)
print(d)
print(c)

class Student:
    def __init__(self,name):
        self.name=name

    def __add__(self, other):
        return self.name +other.name

    def __len__(self):
        return len(self.name)

stu1=Student('张三')

stu2=Student('李四')

s=stu1+stu2
print(s,'实现了两个对象的加法运算(因为在student类中,编写__add__()特殊的方法)')
s=stu1.__add__(stu2)
print(s)
lst=[11,22,33,44]
print(len(lst))
print(lst.__len__())

结果

120
120
张三李四 实现了两个对象的加法运算(因为在student类中,编写__add__()特殊的方法)
张三李四
4
4

进程已结束,退出代码0

47.6 __new__与__init__创建对象

class Person(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __new__(cls,*args,**kwargs):
        print('__new__被调用执行了cls的id值为{0}'.format(id(cls)))
        obj=super().__new__(cls)
        print('创建对象的id为:{0}'.format(id(obj)))
        return  obj
    def __init__(self,name,age):
        print('__init__被调用,self的id 值为:{0}'.format(id(self)))
        self.name=name
        self.age=age

print('object这个类对象的id为:{0}'.format(id(object)))
print('Person这个类对象的id为:{0}'.format(id(Person)))

print('创建Person类的实例对象')
p1=Person('张三',20)
print('p1这个Person类的实例对象的id:{0}'.format(id(p1)))

结果

object这个类对象的id为:140734983666880
Person这个类对象的id为:1959066217800
创建Person类的实例对象
__new__被调用执行了cls的id值为1959066217800
创建对象的id为:1959075803080
__init__被调用,self的id 值为:1959075803080
p1这个Person类的实例对象的id:1959075803080

进程已结束,退出代码0

47.8类的赋值

class CPU:
    pass
class Disk:
    pass
class Computer:
    def __init__(self,cpu,dick):
        self.cpu=cpu
        self.dick=dick

# 变量的赋值
cpu1=CPU()
cpu2=cpu1
print(cpu1,id(cpu1),type(cpu1))
print(cpu2,id(cpu2),type(cpu2))

结果

<__main__.CPU object at 0x00000202CBAC6F88> 2211030265736 <class '__main__.CPU'>
<__main__.CPU object at 0x00000202CBAC6F88> 2211030265736 <class '__main__.CPU'>

进程已结束,退出代码0

47.9 深拷贝与浅拷贝

class CPU:
    pass
class Disk:
    pass
class Computer:
    def __init__(self,cpu,disk):
        self.cpu=cpu
        self.disk=disk

# 变量的赋值
cpu1=CPU()
cpu2=cpu1
print(cpu1,id(cpu1),type(cpu1))
print(cpu2,id(cpu2),type(cpu2))

disk=Disk() #创建一个硬盘类的对象
computer=Computer(cpu1,disk)    #创建一个计算机类的对象

print('-'*20,'浅拷贝','-'*20)
# 浅拷贝
import copy
print(disk)
computer2=copy.copy(computer)
print(computer,computer.cpu,computer.disk)
print(computer2,computer2.cpu,computer2.disk)

print('-'*20,'深拷贝','-'*20)
# 深拷贝
computer3=copy.deepcopy(computer)
print(computer,computer.cpu,computer.disk)
print(computer2,computer2.cpu,computer2.disk)

结果

类的浅拷贝和深拷贝
变量的赋值操作:只是形成两个变量,实际上还是指向同一个对象
浅拷贝:Python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝,
因此,原对象与拷贝对象会引用同一个子对象
深拷贝:使用copy模块的deepcopy函数,递归拷贝对象中包含的子对象、源对象和拷贝对象所有的子对象也不相同

<__main__.CPU object at 0x000001DAAD876DC8> 2038725832136 <class '__main__.CPU'>
<__main__.CPU object at 0x000001DAAD876DC8> 2038725832136 <class '__main__.CPU'>
-------------------- 浅拷贝 --------------------
<__main__.Disk object at 0x000001DAAD876B08>
<__main__.Computer object at 0x000001DAAD876D48> <__main__.CPU object at 0x000001DAAD876DC8> <__main__.Disk object at 0x000001DAAD876B08>
<__main__.Computer object at 0x000001DAAD878C08> <__main__.CPU object at 0x000001DAAD876DC8> <__main__.Disk object at 0x000001DAAD876B08>
-------------------- 深拷贝 --------------------
<__main__.Computer object at 0x000001DAAD876D48> <__main__.CPU object at 0x000001DAAD876DC8> <__main__.Disk object at 0x000001DAAD876B08>
<__main__.Computer object at 0x000001DAAD878C08> <__main__.CPU object at 0x000001DAAD876DC8> <__main__.Disk object at 0x000001DAAD876B08>

进程已结束,退出代码0

48 模块

48.1什么是模块

print('''
模块:
模块的英文名为Modules
函数与模块的关系:一个模块中可以包含N多个函数
在Python中一个扩展名为.py的文件就是一个模块
使用模块的好处:
1.方便其他程序和脚本的导入并使用
2.毕淼函数和变量冲突
3.提高代码的可维护性
4.提高代码的可重用性
''')

def  fun():
    pass
def fun2():
    pass
class Student:
    native_place='吉林'
    def eat(self,name,age):
        self.name=name
        self.age=age
    @classmethod
    def cm(cls):
        pass
    @staticmethod
    def sm():
        pass

a=10
b=20
print(a+b)

结果

模块:
模块的英文名为Modules
函数与模块的关系:一个模块中可以包含N多个函数
在Python中一个扩展名为.py的文件就是一个模块
使用模块的好处:
1.方便其他程序和脚本的导入并使用
2.毕淼函数和变量冲突
3.提高代码的可维护性
4.提高代码的可重用性

30

进程已结束,退出代码0

48.2模块的导入

print('导入模块')
import math
print(id(math))
print(type(math))
print(math)
print(math.pi)
print(dir(math))
print(math.pow(2,3),type(math.pow(2,3)))
print(math.floor(9.999))

from math import pi
import math
print(pi)
print(pow(2,3))
print(math.pow(2,3))

结果

导入模块
1584978229992
<class 'module'>
<module 'math' (built-in)>
3.141592653589793
['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 'asin', 'asinh', 'atan', 'atan2', 'atanh', 'ceil', 'copysign', 'cos', 'cosh', 'degrees', 'e', 'erf', 'erfc', 'exp', 'expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'remainder', 'sin', 'sinh', 'sqrt', 'tan', 'tanh', 'tau', 'trunc']
8.0 <class 'float'>
9
3.141592653589793
8
8.0

进程已结束,退出代码0

48.3 模块定义

def add(a,b):
    return a+b
def div(a,b):
    return a/b
#如何导入自定义模块

48.4导入自己定义的模块

找到自己定义的模块的位置,然后import导入

import demo3
print(demo3.add(10,20))
print(demo3.div(10,20))

from demo3 import add
print(add(10,20))

import demo5
print(demo5.add(100,200))
print('不执行在main下面的主程序')

48.5 以主程序方式运行

print('''
以主程序形式运行:
在每个模块的定义中都包含一个记录模块的变量__name__,
程序可以检查该变量,以确定他们在哪个模块中执行。
如果一个模块不是被导入到其他程序中执行,那么它可能在解释器的顶级模块中执行。
顶级模块的__name__变量的值为__main__
if __name__ == '__main__' :
     pass
''')

def add(a,b):
    return a+b

if __name__=='__main__':
    print(add(10,20))   #只有当点击运行demo5时,才会执行运算

print(add(100,300))  #可以进行调用

结果

以主程序形式运行:
在每个模块的定义中都包含一个记录模块的变量__name__,
程序可以检查该变量,以确定他们在哪个模块中执行。
如果一个模块不是被导入到其他程序中执行,那么它可能在解释器的顶级模块中执行。
顶级模块的__name__变量的值为__main__
if __name__ == '__main__' :
     pass

30
400

进程已结束,退出代码0

48.6 python的包

print('''
python中的包:
包是一个分层次的目录结构,它将一组功能相近的模块组织在一个目录下
作用:
代码规范
避免模块名称冲突
包与目录的区别
包含__init__.py文件的目录称为包
目录里通常不包含__init__.py文件
包的导入
import 包名.模块名
''')

48.7 导入自定义包

import pageage1.module_A as ma
# print(pageage1.module_A.a)
print(ma.a)

print('导入带有包的模块时注意事项')
import pageage1
import demo5
print('使用import方式进行导入时,智能跟包名或者模块名')

from pageage1 import module_A
from pageage1.module_A import a

print('使用from...import可以导入包,模块,函数,变量')

48.8 python中常用的内容模块

import sys  # 与Python解释器及其环境操作相关的标准库
import time # 提供与时间相关的各种函数的标准库
import os   #提供了访问操作系统服务功能的标准库
import calendar #提供与日期相关的各种函数的标准库
import urllib.request   # 用于读取来自网上(服务器)的数据标准库
import json #用于使用JSON序列化和反序列化对象
import re   #用于在字符串中执行正则化表达式匹配和替换
import math #提供标准算数运算函数的标准库
import decimal  #用于进行精确控制运算精度、有效位数和四舍五入操作的十进制运算
import logging  #提供了灵活的记录事件、错误、警告和调试信息等日志信息的功能

print(sys.getsizeof(21))
print(sys.getsizeof(45))
print(sys.getsizeof(True))
print(sys.getsizeof(False))
print(time.time())
print(time.localtime(time.time()))
print(urllib.request.urlopen('http://www.baidu.com').read())
print(math.pi)

48.9 安装python包

可以在命令行输入

conda install **(包名)
#例如
conda install schedule

或者直接在pycharm中直接打开python解释器,找到对应的包,进行安装即可

Python 将列表切分为两两一组_人工智能

49 编码

49.1 编码格式

编码格式
常见的字符编码格式
python的解释器使用的是Unicode(内存)
.py文件在磁盘上使用UTF—8存储(外存)

encoding=UTF-8 默认形式
修改编码方式,默认编码方式为UTF-8,上面修改为GBK,ANSI
不同编码方式,磁盘的大小不一样,即字节数不一样

49.2 文件读取

打开文件记得要.close()关闭文件

print('以只读模式打开文件,文件的指针会放在文件的开头')
file= open('a.txt','r')
print(file.readlines())
file.close()

49.2 文件只写模式

print('以只写模式打开文件,如果文件不存在则创建,如果文件存在,则覆盖原有的内容,文件指针在文件的开头')
file= open('b.txt','w')
file.write('helloworld')
file.close()

49.3 文件追加模式

print('以追加模式打开文件,如果文件不存在则创建,文件指针在文件开头,如果文件存在,则在文件末尾追加文件内容,文件指针在源文件末尾')
file=open('b.txt','a')
file.write('python')
file.close()

49.4 二进制打开文件

print('以二进制方式打开文件,不能单独使用,需要与其他模式一起使用,rb或者wb')
src_file=open('logo.png','rb')

target_file=open('logo.png', 'wb')

target_file.write(src_file.read())

target_file.close()
src_file.close()
file=open('a.txt','r')
file1=open('a.txt','a')
lst=['123456789','1']
file1.writelines(lst )
file1.close()

print(file.read(2))
print(file.readline())
print(file.readlines() )
file.close()
file=open('a.txt','r')
file1=open('a.txt','a')
lst=['123456789','1']
file1.writelines(lst )
file1.close()
print(file.read(2))
print(file.readline())
print(file.readlines() )
file.close()
with open('a.txt','r') as file:
    print(file.read())

49.5 上下文管理器

'''MyContentMgr实现了特殊方法__enter__(),__exit__()称为该类帝乡遵循了上下文管理协议
该类对象的实例对象,称为上下文管理器

MyContentMgr()
'''
class MyContentMgr(object):
    def __enter__(self):
        print('enter方法被调用执行了')
        return self
    def __exit__(self, exc_type, exc_val, exc_tb):
        print('exit方法被调用了')

    def show(self):
        print('show方法被调用执行了')

with MyContentMgr() as file:
    file.show()

结果

enter方法被调用执行了
show方法被调用执行了
exit方法被调用了

进程已结束,退出代码0

49.6 复制图片

with open('logo.png','rb') as src_file:
    with open('copy2logo.png','wb') as target_file:
        target_file.write(src_file.read())

49.7 os模块常用方法

import os
# os.system('notepad.exe')#打开记事本
# os.system('calc.exe')#打开计算器
os.startfile('C:\\Program Files (x86)\\Tencent\\WeChat.exe')#打开指定文件

import os
print(os.getcwd())
print(os.listdir())
lst=os.listdir('../chap15')
print(lst)

# os.mkdir('newdir2')#创建目录
# os.makedirs('A/B/C')#创建多级目录
# os.rmdir('newdir2')#删除目录
os.removedirs('A/B/C')#移除多级目录
os.chdir('')#将path设置为当前工作目录

import os.path
print(os.path.abspath('demo13.py'))#获取文件或目录的绝对路径
print(os.path.exists('demo13.py'),os.path.exists('demo14.py'))# 用于判断文件是否存在
print(os.path.join('E','demo13.py'))#将目录或者文件拼接起来
print(os.path.split('demo13.py'))#文件名和扩展名进行分离
print(os.path.splitext('demo13.py'))#分离文件名和扩展名
print(os.path.basename('demo15.py'))#提取文件名
print(os.path.dirname('demo13.py'))#从一个路径中提取文件路径,不包括文件名
print(os.path.isdir('demo13.py'))#判断是否为路径

import os
path=os.getcwd()
lst=os.listdir(path)
for filename in lst:
    if filename.endswith('.py'):
        print(filename)


import os
path=os.getcwd()
lst_files=os.walk(path)
for dirpath,dirname,filename in lst_files:
    print(dirpath)
    print(dirname)
    print(filename)
    for fir in dirname:
        print(os.path.join(dirpath,dir))
    for file in filename:
        print(os.path.join(dirpath,file))