Python知识点总结

Python知识点总结

一、基本知识

1、编码

​ 默认情况下,Python3源码文件以UTF-8编码,所有字符串都是Unicode字符串

2、标识符

  • ​ 第一字符必须是字母表中字母或下划线。

  • ​ 标识符的其它的部分由字母、数字和下划线组成。

  • ​ 标识符对大小敏感

  • ​ 不能使用内置关键字

  • False     None    True   and      as       assert   break     class  
    continue  def     del    elif     else     except   finally   for
    from      global  if     import   in       is       lambda    nonlocal
    not       or      pass   raise    return   try      while     with  
    yield
    

3、命名习惯

  • 见名知意
  • 变量采用小驼峰命名,类名、函数名、属性、命名空间采用小驼峰
  • 常数一般全部采用大写且单词之间用下划线隔开

4、注释

# 单行注释以“#”开头

多行注释可采用
1"""
    多行注释
    多行注释
    多行注释
    """
2'''
    多行注释
    多行注释
    多行注释
    '''

5、行与缩进

Python是使用缩进来表示代码块的,不需要使用大括号=={ },也不要使用分号;==

6、多行语句

Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠 \ 来实现多行语句,例如:

total = item_one + \
	    item_two + \
    	item_three

在 [], {}, 或 () 中的多行语句,不需要使用反斜杠 \,例如:

total = ['item_one', 'item_two', 'item_three',
        'item_four', 'item_five']

7、数字类型

python中数字有四种类型:整数、布尔型、浮点数和复数。

  • int (整数), 如 1, 只有一种整数类型 int,表示为长整型,没有 python2 中的 Long。
  • bool (布尔), 如 True。
  • float (浮点数), 如 1.23、3E-2
  • complex (复数), 如 1 + 2j、 1.1 + 2.2j

8、输入与输出语句

(1)input( )

Python3.x 中 input() 函数接受一个标准输入数据,返回为 string 类型。

***注意:*在 Python3.x 中 raw_input() 和 input() 进行了整合,去除了 raw_input( ),仅保留了input( )函数,其接收任意任性输入,将所有输入默认为字符串处理,并返回字符串类型。

语法:input([prompt])

input()接受多个值

#输入三角形的三边长
a,b,c = (input("请输入三角形三边的长:").split())
a= int(a)
b= int(b)
c= int(c)

#计算三角形的半周长p
p=(a+b+c)/2

#计算三角形的面积s
s=(p*(p-a)*(p-b)*(p-c))**0.5

#输出三角形的面积
print("三角形面积为:",format(s,'.2f'))

# 输出结果
请输入三角形三边的长:3 4 5
三角形面积为: 6.00

(2)print()

语法:

print(*objects, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False)

objects – 复数,表示可以一次输出多个对象。输出多个对象时,需要用 , 分隔。
sep – 用来间隔多个对象,默认值是一个空格。
end – 用来设定以什么结尾。默认值是换行符 \n,我们可以换成其他字符串。
file – 要写入的文件对象。
flush – 输出是否被缓存通常决定于 file,但如果 flush 关键字参数为 True,流会被强制刷新。

实例

>>> print("www","runoob","com",sep=".")  # 设置间隔符
www.runoob.com

9、import与from…import

在 python 用 import 或者 from…import 来导入相应的模块。

将整个模块(somemodule)导入,格式为: import somemodule

从某个模块中导入某个函数,格式为: from somemodule import somefunction

从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc

将某个模块中的全部函数导入,格式为: from somemodule import *

10、运算符

运算符描述实例
+加 - 两个对象相加a + b 输出结果 31
-减 - 得到负数或是一个数减去另一个数a - b 输出结果 -11
*乘 - 两个数相乘或是返回一个被重复若干次的字符串a * b 输出结果 210
/除 - x 除以 yb / a 输出结果 2.1
%取模 - 返回除法的余数b % a 输出结果 1
**幂 - 返回x的y次幂a**b 为10的21次方
//取整除 - 向下取接近商的整数>>> 9//2 4 >>> -9//2 -5

二、数字、字符串、列表、元组、字典、集合

1、数字

(1)数据类型

Python 支持三种不同的数值类型:

  • 整型(int) - 通常被称为是整型或整数,是正或负整数,不带小数点。Python3 整型是没有限制大小的,可以当作 Long 类型使用,所以 Python3 没有 Python2 的 Long 类型。布尔(bool)是整型的子类型。
  • 浮点型(float) - 浮点型由整数部分与小数部分组成,浮点型也可以使用科学计数法表示(2.5e2 = 2.5 x 102 = 250)
  • 复数( (complex)) - 复数由实数部分和虚数部分构成,可以用a + bj,或者complex(a,b)表示, 复数的实部a和虚部b都是浮点型。

我们可以使用十六进制和八进制来代表整数:

>>> number = 0xA0F # 十六进制
>>> number
2575

>>> number=0o37 # 八进制
>>> number
31

(2)数据类型转换

​ 数据类型的转换,只需要将数据类型作为函数名即可。

  • int(x) 将x转换为一个整数。
  • float(x) 将x转换到一个浮点数。
  • complex(x) 将x转换到一个复数,实数部分为 x,虚数部分为 0。
  • complex(x, y) 将 x 和 y 转换到一个复数,实数部分为 x,虚数部分为 y。x 和 y 是数字表达式。

(3)Python数字运算

在整数除法中,除法 / 总是返回一个浮点数,如果只想得到整数的结果,丢弃可能的分数部分,可以使用运算符 //

>>> 17 / 3  # 整数除法返回浮点型
5.666666666666667
>>>
>>> 17 // 3  # 整数除法返回向下取整后的结果
5
>>> 17 % 3  # %操作符返回除法的余数
2
>>> 5 * 3 + 2 
17

注意:****// 得到的并不一定是整数类型的数,它与分母分子的数据类型有关系。

>>> 7//2
3
>>> 7.0//2
3.0
>>> 7//2.0
3.0

(4) 数学函数

函数返回值 ( 描述 )
abs(x)返回数字的绝对值,如abs(-10) 返回 10
ceil(x)返回数字的上入整数,如math.ceil(4.1) 返回 5
cmp(x, y)如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1。 Python 3 已废弃,使用 (x>y)-(x<y) 替换
exp(x)返回e的x次幂(ex),如math.exp(1) 返回2.718281828459045
fabs(x)返回数字的绝对值,如math.fabs(-10) 返回10.0
floor(x)返回数字的下舍整数,如math.floor(4.9)返回 4
log(x)如math.log(math.e)返回1.0,math.log(100,10)返回2.0
log10(x)返回以10为基数的x的对数,如math.log10(100)返回 2.0
max(x1, x2,…)返回给定参数的最大值,参数可以为序列。
min(x1, x2,…)返回给定参数的最小值,参数可以为序列。
modf(x)返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。
pow(x, y)x**y 运算后的值。
round(x ,n])返回浮点数 x 的四舍五入值,如给出 n 值,则代表舍入到小数点后的位数。其实准确的说是保留值将保留到离上一位更近的一端。
sqrt(x)返回数字x的平方根。

(5)随机数函数

函数描述
choice(seq)从序列的元素中随机挑选一个元素,比如random.choice(range(10)),从0到9中随机挑选一个整数。
[randrange (start,] stop [,step])从指定范围内,按指定基数递增的集合中获取一个随机数,基数默认值为 1
random()随机生成下一个实数,它在[0,1)范围内。
[seed(x])改变随机数生成器的种子seed。如果你不了解其原理,你不必特别去设定seed,Python会帮你选择seed。
shuffle(lst)将序列的所有元素随机排序
uniform(x, y)随机生成下一个实数,它在[x,y]范围内。

(6)三角函数

函数描述
acos(x)返回x的反余弦弧度值。
asin(x)返回x的反正弦弧度值。
atan(x)返回x的反正切弧度值。
atan2(y, x)返回给定的 X 及 Y 坐标值的反正切值。
cos(x)返回x的弧度的余弦值。
hypot(x, y)返回欧几里德范数 sqrt(xx + yy)。
sin(x)返回的x弧度的正弦值。
tan(x)返回x弧度的正切值。
degrees(x)将弧度转换为角度,如degrees(math.pi/2) , 返回90.0
radians(x)将角度转换为弧度

(7)数学常量

常量描述
pi数学常量 pi(圆周率,一般以π来表示)
e数学常量 e,e即自然常数(自然常数)。

2、字符串

(1)访问字符串里的值

​ Python 不支持单字符类型,单字符在 Python 中也是作为一个字符串使用。Python 访问子字符串,可以使用方括号 [] 来截取字符串,字符串的截取的语法格式如下:

变量[头下标:尾下标]

(2)字符串拼接

​ 字符串拼接采用“+”

(3)转义字符

在需要在字符中使用特殊字符时,python 用反斜杠 ==\==转义字符。

(4)Python字符串运算符

操作符描述实例
+字符串连接a + b 输出结果: HelloPython
*重复输出字符串a*2 输出结果:HelloHello
[]通过索引获取字符串中字符a[1] 输出结果 e
[ : ]截取字符串中的一部分,遵循左闭右开原则,str[0:2] 是不包含第 3 个字符的。a[1:4] 输出结果 ell
in成员运算符 - 如果字符串中包含给定的字符返回 True’H’ in a 输出结果 True
not in成员运算符 - 如果字符串中不包含给定的字符返回 True’M’ not in a 输出结果 True
r/R原始字符串 - 原始字符串:所有的字符串都是直接按照字面的意思来使用,没有转义特殊或不能打印的字符。 原始字符串除在字符串的第一个引号前加上字母 r(可以大小写)以外,与普通字符串有着几乎完全相同的语法。print( r’\n’ ) print( R’\n’ )
a = "Hello"
b = "Python"
 
print("a + b 输出结果:", a + b)
print("a * 2 输出结果:", a * 2)
print("a[1] 输出结果:", a[1])
print("a[1:4] 输出结果:", a[1:4])
 
if( "H" in a) :
    print("H 在变量 a 中")
else :
    print("H 不在变量 a 中")
 
if( "M" not in a) :
    print("M 不在变量 a 中")
else :
    print("M 在变量 a 中")
 
print (r'\n')
print (R'\n')

# 输出结果
a + b 输出结果: HelloPython
a * 2 输出结果: HelloHello
a[1] 输出结果: e
a[1:4] 输出结果: ell
H 在变量 a 中
M 不在变量 a 中
\n
\n

(5)三引号

python三引号允许一个字符串跨多行,字符串中可以包含换行符、制表符以及其他特殊字符。实例如下

para_str = """这是一个多行字符串的实例
多行字符串可以使用制表符
TAB ( \t )。
也可以使用换行符 [ \n ]。
"""
print (para_str)

以上实例执行结果为:

这是一个多行字符串的实例
多行字符串可以使用制表符
TAB (    )。
也可以使用换行符 [ 
 ]。

(6)f-string

f-string 格式化字符串以 f 开头,后面跟着字符串,字符串中的表达式用大括号 {} 包起来,它会将变量或表达式计算后的值替换进去,实例如下:

>>> name = 'Runoob'
>>> f'Hello {name}'  # 替换变量
'Hello Runoob'
>>> f'{1+2}'         # 使用表达式
'3'

>>> w = {'name': 'Runoob', 'url': 'www.runoob.com'}
>>> f'{w["name"]}: {w["url"]}'

(7)字符串函数

序号方法及描述
1capitalize() 将字符串的第一个字符转换为大写
2center(width, fillchar) 返回一个指定的宽度 width 居中的字符串,fillchar 为填充的字符,默认为空格。
3count(str, beg= 0,end=len(string)) 返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数
4bytes.decode(encoding=“utf-8”, errors=“strict”) Python3 中没有 decode 方法,但我们可以使用 bytes 对象的 decode() 方法来解码给定的 bytes 对象,这个 bytes 对象可以由 str.encode() 来编码返回。
5encode(encoding=‘UTF-8’,errors=‘strict’) 以 encoding 指定的编码格式编码字符串,如果出错默认报一个ValueError 的异常,除非 errors 指定的是’ignore’或者’replace’
6endswith(suffix, beg=0, end=len(string)) 检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False.
7expandtabs(tabsize=8) 把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是 8 。
8find(str, beg=0, end=len(string)) 检测 str 是否包含在字符串中,如果指定范围 beg 和 end ,则检查是否包含在指定范围内,如果包含返回开始的索引值,否则返回-1
9index(str, beg=0, end=len(string)) 跟find()方法一样,只不过如果str不在字符串中会报一个异常。
10isalnum() 如果字符串至少有一个字符并且所有字符都是字母或数字则返 回 True,否则返回 False
11isalpha() 如果字符串至少有一个字符并且所有字符都是字母或中文字则返回 True, 否则返回 False
12isdigit() 如果字符串只包含数字则返回 True 否则返回 False…
13islower() 如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False
14isnumeric() 如果字符串中只包含数字字符,则返回 True,否则返回 False
15isspace() 如果字符串中只包含空白,则返回 True,否则返回 False.
16istitle() 如果字符串是标题化的(见 title())则返回 True,否则返回 False
17isupper() 如果字符串中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False
18join(seq) 以指定字符串作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
19len(string) 返回字符串长度
20[ljust(width, fillchar]) 返回一个原字符串左对齐,并使用 fillchar 填充至长度 width 的新字符串,fillchar 默认为空格。
21lower() 转换字符串中所有大写字符为小写.
22lstrip() 截掉字符串左边的空格或指定字符。
23maketrans() 创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。
24max(str) 返回字符串 str 中最大的字母。
25min(str) 返回字符串 str 中最小的字母。
26[replace(old, new , max]) 把 将字符串中的 old 替换成 new,如果 max 指定,则替换不超过 max 次。
27rfind(str, beg=0,end=len(string)) 类似于 find()函数,不过是从右边开始查找.
28rindex( str, beg=0, end=len(string)) 类似于 index(),不过是从右边开始.
29[rjust(width,, fillchar]) 返回一个原字符串右对齐,并使用fillchar(默认空格)填充至长度 width 的新字符串
30rstrip() 删除字符串末尾的空格或指定字符。
31split(str="", num=string.count(str)) 以 str 为分隔符截取字符串,如果 num 有指定值,则仅截取 num+1 个子字符串
32[splitlines(keepends]) 按照行(’\r’, ‘\r\n’, \n’)分隔,返回一个包含各行作为元素的列表,如果参数 keepends 为 False,不包含换行符,如果为 True,则保留换行符。
33startswith(substr, beg=0,end=len(string)) 检查字符串是否是以指定子字符串 substr 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查。
34[strip(chars]) 在字符串上执行 lstrip()和 rstrip()
35swapcase() 将字符串中大写转换为小写,小写转换为大写
36title() 返回"标题化"的字符串,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())
37translate(table, deletechars="") 根据 str 给出的表(包含 256 个字符)转换 string 的字符, 要过滤掉的字符放到 deletechars 参数中
38upper() 转换字符串中的小写字母为大写
39zfill (width) 返回长度为 width 的字符串,原字符串右对齐,前面填充0
40isdecimal() 检查字符串是否只包含十进制字符,如果是返回 true,否则返回 false。

3、列表

序列是 Python 中最基本的数据结构。
序列中的每个值都有对应的位置值,称之为索引,第一个索引是 0,第二个索引是 1,依此类推。
Python 有 6 个序列的内置类型,但最常见的是列表和元组。
列表都可以进行的操作包括索引,切片,加,乘,检查成员。
此外,Python 已经内置确定序列的长度以及确定最大和最小的元素的方法。
列表是最常用的 Python 数据类型,它可以作为一个方括号内的逗号分隔值出现。
列表的数据项不需要具有相同的类型
创建一个列表,只要把逗号分隔的不同的数据项使用方括号括起来即可。

(1)访问列表

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7VUEsFAb-1633761155809)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20210909205252853.png)]

list1 = ['red', 'green', 'blue', 'yellolist1 = [1, 2, 3, 4, 5, 6]

print(list1[0])		# 1
print(list1[0:1])	# [1]
print(list1[-1])	# 6
print(list1[-2])	# 5
print(list1[0:3])	# [1, 2, 3]
print(list1[-1])	# 6
print(list1[-3:-1])	# [4, 5]
print(list1[-3:6])	# [4, 5, 6]
(2)增加元素

​ 对列表的数据项进行修改或更新,你也可以使用 append() 方法来添加列表项。

list1 = [1, 2, 3, 4, 5, 6]
list1.append(7)
print(list1)		# [1, 2, 3, 4, 5, 6, 7]

list2 = ['1', '2', '3', '4', '5', '6']

list1.append(list2)
print(list1)		# [1, 2, 3, 4, 5, 6, 7, ['1', '2', '3', '4', '5', '6', '7']]
(3)删除元素
"""
del 是删除指定下标的元素
remove 是删除列表中第一次出现具体的值
"""

list1 = [1, 2, 3, 4, 5, 3, 6, 3]
list1.remove(3)
print(list1)
(4)列表操作符
Python 表达式结果描述
len([1, 2, 3])3长度
[1, 2, 3] + [4, 5, 6][1, 2, 3, 4, 5, 6]组合
[‘Hi!’] * 4[‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’]重复
3 in [1, 2, 3]True元素是否存在于列表中
for x in [1, 2, 3]: print(x, end=" ")1 2 3迭代
(5)列表函数
序号函数
1len(list) 列表元素个数
2max(list) 返回列表元素最大值
3min(list) 返回列表元素最小值
4list(seq) 将元组转换为列表
(6)列表方法
序号方法
1list.append(obj) 在列表末尾添加新的对象
2list.count(obj) 统计某个元素在列表中出现的次数
3list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
4list.index(obj) 从列表中找出某个值第一个匹配项的索引位置
5list.insert(index, obj) 将对象插入列表
6[list.pop(index=-1]) 移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
7list.remove(obj) 移除列表中某个值的第一个匹配项
8list.reverse() 反向列表中元素
9list.sort( key=None, reverse=False) 对原列表进行排序
10list.clear() 清空列表
11list.copy() 复制列表

4、元组

Python 的元组与列表类似,不同之处在于元组的元素不能修改。
元组使用小括号 ( ),列表使用方括号 [ ]
元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

(1)访问元组
tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 )
 
print ("tup1[0]: ", tup1[0])
print ("tup2[1:5]: ", tup2[1:5])
(2)修改元组

元组中的元素值是不允许修改的,但我们可以对元组进行连接组合

tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')
 
# 以下修改元组元素操作是非法的。
# tup1[0] = 100
 
# 创建一个新的元组
tup3 = tup1 + tup2
print (tup3)	# (12, 34.56, 'abc', 'xyz')
(3)删除元组

元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组

tup = ('Google', 'Runoob', 1997, 2000)
 
print (tup)
del tup
print ("删除后的元组 tup : ")
print (tup)	# 元组被删除后,输出变量会有异常信息
(4)元组运算符
Python 表达式结果描述
len((1, 2, 3))3计算元素个数
(1, 2, 3) + (4, 5, 6)(1, 2, 3, 4, 5, 6)连接
(‘Hi!’,) * 4(‘Hi!’, ‘Hi!’, ‘Hi!’, ‘Hi!’)复制
3 in (1, 2, 3)True元素是否存在
for x in (1, 2, 3): print (x,)1 2 3迭代
(5)元组内置函数
序号方法及描述实例
1len(tuple) 计算元组元素个数。>>> tuple1 = ('Google', 'Runoob', 'Taobao') >>> len(tuple1) 3 >>>
2max(tuple) 返回元组中元素最大值。>>> tuple2 = ('5', '4', '8') >>> max(tuple2) '8' >>>
3min(tuple) 返回元组中元素最小值。>>> tuple2 = ('5', '4', '8') >>> min(tuple2) '4' >>>
4tuple(iterable) 将可迭代系列转换为元组。>>> list1= ['Google', 'Taobao', 'Runoob', 'Baidu'] >>> tuple1=tuple(list1) >>> tuple1 ('Google', 'Taobao', 'Runoob', 'Baidu')
(6)元组解包

6.1 一对一解包

当返回值是一个元组时,一对一解包会非常有用

def retrieve_user_posts(user_id):
    # 获取一些数据
    post_count = 20
    recent_posts = ["文章 1", "文章 2", "文章 3"]
    return post_count, recent_posts

total_count, latest_posts = retrieve_user_posts(123456)
print(total_count)	# 20
print(latest_posts)	# ['文章 1', '文章 2', '文章 3']

6.2 使用下划线_

可以使用下划线存放不想要的数据,但是实质上下划线也是变量名

user_data = ("张三", 44, "男")
name, _, gender = user_data
print(f"姓名: {name}; 性别: {gender}") # 姓名: 张三; 性别: 男

6.3 使用星号*

​ 当元组包含多个项目时,很可能要获取连续的项目的值。这种情况就可以使用星号(*),它可以通过其他变量捕获所有未指定项目的值。

numbers = (1, 2, 3, 4, 5)
first_num, *middle_nums, last_num = numbers
print("第一个数字:", first_num)	# 第一个数字: 1
print("最后一个数字:", last_num)  # 最后一个数字: 5
print("剩下的数字:", middle_nums) # 剩下的数字: [2, 3, 4]

numbers = (1, 2, 3)
first_num, *middle_nums, last_num = numbers
print("第一个数字:", first_num)	    # 第一个数字: 1
print("最后一个数字:", last_num)      # 最后一个数字: 3
print("剩下的数字:", middle_nums)	# 剩下的数字: [2]

6.4 结合使用星号*和下划线_

numbers = (1, 2, 3, 4, 5, 6, 7, 8, 9)
one, *_, seven, eight, nine = numbers
print("不想要的数字:", _)

5、字典

字典是另一种可变容器模型,且可存储任意类型对象。
字典的每个键值 key=>value 对用冒号 : 分割,每个对之间用逗号(,)分割,整个字典包括在花括号 {}
键必须是唯一的,但值则不必。
值可以取任何数据类型,但键必须是不可变的,如字符串,数字。

(1)访问字典里的值
1.1 key值查找
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
print(dict1['name'])  # Tom
print(dict1['id'])  # 报错
1.2 get()
  • 语法

​ 字典序列.get(key, 默认值),如果key值不存在则返回第二个默认值,如果默认值不存在,则返回None。

dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
print(dict1.get('name'))  # Tom
print(dict1.get('id', 110))  # 110
print(dict1.get('id'))  # None
1.3 keys()
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
print(dict1.values())  # dict_values(['Tom', 20, '男'])
1.4 values()
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
print(dict1.values())  # dict_values(['Tom', 20, '男'])
1.5 items()
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
print(dict1.items())  # dict_items([('name', 'Tom'), ('age', 20), ('gender', '男')])
(2)修改字典

写法:字典序列[key] = 值

注意:如果key存在,则修改对应的值;如果key不存在,则新添加键值对。

(3)删除字典
  • del()/del:删除字典或者删除字典里的键值对
dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}

del dict1['gender']
# 结果:{'name': 'Tom', 'age': 20}
print(dict1)
  • clear():清空字典

    dict1 = {'name': 'Tom', 'age': 20, 'gender': '男'}
    
    dict1.clear()
    print(dict1)  # {}
    
(4)字典内置函数
序号函数及描述实例
1len(dict) 计算字典元素个数,即键的总数。>>> dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'} >>> len(dict) 3
2str(dict) 输出字典,可以打印的字符串表示。>>> dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'} >>> str(dict) "{'Name': 'Runoob', 'Class': 'First', 'Age': 7}"
3type(variable) 返回输入的变量类型,如果变量是字典就返回字典类型。>>> dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'} >>> type(dict) <class 'dict'>
(5)字典方法
序号函数及描述
1radiansdict.clear() 删除字典内所有元素
2radiansdict.copy() 返回一个字典的浅复制
3radiansdict.fromkeys() 创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值
4radiansdict.get(key, default=None) 返回指定键的值,如果键不在字典中返回 default 设置的默认值
5key in dict 如果键在字典dict里返回true,否则返回false
6radiansdict.items() 以列表返回一个视图对象
7radiansdict.keys() 返回一个视图对象
8radiansdict.setdefault(key, default=None) 和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default
9radiansdict.update(dict2) 把字典dict2的键/值对更新到dict里
10radiansdict.values() 返回一个视图对象
11[pop(key,default]) 删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。
12popitem() 随机返回并删除字典中的最后一对键和值。

6、集合

集合(set)是一个无序的不重复元素序列。可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

parame = {value01,value02,...}
或者
set(value)

(1)添加元素

1.1 add()

将元素添加到集合中,如果元素已存在,则不进行任何操作

thisset = set(("Google", "Runoob", "Taobao"))
thisset.add("Facebook")
 print(thisset)
# 输出结果:{'Taobao', 'Facebook', 'Google', 'Runoob'}
1.2 update()

添加元素可以是列表、元组、字典等

>>> thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.update({1,3})
>>> print(thisset)
{1, 3, 'Google', 'Taobao', 'Runoob'}
>>> thisset.update([1,4],[5,6])  
>>> print(thisset)
{1, 3, 4, 5, 6, 'Google', 'Taobao', 'Runoob'}

(2)移除元素

2.1 remove()

将元素x从集合中移除,如果元素不存在,则会发生错误。

>>> thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.remove("Taobao")
>>> print(thisset)
{'Google', 'Runoob'}
>>> thisset.remove("Facebook")   # 不存在会发生错误
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'Facebook'
2.2 discard()

将元素x从集合中移除,如果元素不存在,则不会发生错误。

>>> thisset = set(("Google", "Runoob", "Taobao"))
>>> thisset.discard("Facebook")  # 不存在不会发生错误
>>> print(thisset)
{'Taobao', 'Google', 'Runoob'}
2.3 pop()

​ 设置随机删除集合中的一个元素

thisset = set(("Google", "Runoob", "Taobao", "Facebook"))
x = thisset.pop()
print(x)

(3)计算集合里元素的数目

函数:len()

>>> thisset = set(("Google", "Runoob", "Taobao"))
>>> len(thisset)
3

(4)清空集合

函数:clear()

thisset = set((1, 2, 3, 4, 5, 6))
thisset.clear()
print(thisset) # set()

(5)判断元素是否在集合中

  • 语法格式:x in s

    判断元素x是否在集合中,如果存在返回True,不存在返回False。

>>> thisset = set(("Google", "Runoob", "Taobao"))
>>> "Runoob" in thisset
True
>>> "Facebook" in thisset
False

(6)集合内置方法

方法描述
add()为集合添加元素
clear()移除集合中的所有元素
copy()拷贝一个集合
difference()返回多个集合的差集
difference_update()移除集合中的元素,该元素在指定的集合也存在。
discard()删除集合中指定的元素
intersection()返回集合的交集
intersection_update()返回集合的交集。
isdisjoint()判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False。
issubset()判断指定集合是否为该方法参数集合的子集。
issuperset()判断该方法的参数集合是否为指定集合的子集
pop()随机移除元素
remove()移除指定元素
symmetric_difference()返回两个集合中不重复的元素集合。
symmetric_difference_update()移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中。
union()返回两个集合的并集
update()给集合添加元素

三、函数

1、定义函数

def 函数名(参数):
	代码1
    代码2
    ......

2、说明文档

定义函数的说明文档

def 函数名(参数):
    """文档位置"""
    代码
    ...

查看说明文档

方式一:

def 函数名(参数)"""说明文档"""
    代码

help(函数名)

方式二:

def A():
    """说明文档"""
    pass

# 查看说明文档
print(A.__doc__)

3、局部变量与全局变量

局部变量是定义在函数体内部的变量,即只在函数体内部生效。局部变量的作用:在函数体内部,临时保存数据,即当函数调用完成后,则销毁局部变量。

全局变量,指的是在函数体内、外都能生效的变量。

注意点:在函数体内修改全局变量,需要在变量名前加global关键字

i = 0
def A():
    global i
    i += 1
    print(i)
    
print(i) # 0
A()	   	 # 1
print(i) # 1

4、参数传递

在 python 中,类型属于对象,变量是没有类型的:

a=[1,2,3]
a="Runoob"

以上代码中,[1,2,3] 是 List 类型,“Runoob” 是 String 类型,而变量 a 是没有类型,她仅仅是一个对象的引用(一个指针),可以是指向 List 类型对象,也可以是指向 String 类型对象。

在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。

  • **不可变类型:**变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a。
  • **可变类型:**变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。

python 函数的参数传递:

  • **不可变类型:**类似 C++ 的值传递,如整数、字符串、元组。如 fun(a),传递的只是 a 的值,没有影响 a 对象本身。如果在 fun(a) 内部修改 a 的值,则是新生成一个 a 的对象。
  • **可变类型:**类似 C++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后 fun 外部的 la 也会受影响

python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。

实例

def change(a):
    print(id(a))   # 指向的是同一个对象,id()函数是用来查看内存地址
    a=10
    print(id(a))   # 一个新对象
 
a=1
print(id(a))
change(a)

# 输出结果
4379369136
4379369136
4379369424

# 可写函数说明
def changeme( mylist ):
   "修改传入的列表"
   mylist.append([1,2,3,4])
   print ("函数内取值: ", mylist)
   return
 
# 调用changeme函数
mylist = [10,20,30]
changeme( mylist )
print ("函数外取值: ", mylist)

5、函数参数

5.1 位置参数

位置参数:调用函数时根据函数定义的参数位置来传递参数。

注意:传递和定义参数的顺序及个数必须一致。

def user_info(name, age, gender):
    print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')


user_info('TOM', 20, '男')

5.2 关键字参数

​ 函数调用,通过“键=值”形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。

注意:函数调用时,如果有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序。

def user_info(name, age, gender):
    print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')


user_info('Rose', age=20, gender='女')
user_info('小明', gender='男', age=16)

5.3 默认参数

​ 缺省参数也叫默认参数,用于定义函数,为参数提供默认值,调用函数时可不传该默认参数的值(注意:所有位置参数必须出现在默认参数前,包括函数定义和调用)。

注意:函数调用时,如果为缺省参数传值则修改默认参数值;否则使用这个默认值。

def user_info(name, age, gender='男'):
    print(f'您的名字是{name}, 年龄是{age}, 性别是{gender}')


user_info('TOM', 20)
user_info('Rose', 18, '女')

5.4 可变参数

​ 用于不确定调用的时候会传递多少个参数(不传参也可以)的场景。此时,可用包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会显得非常方便。

  • 包裹位置传递
def user_info(*args):
    print(args)


# ('TOM',)
user_info('TOM')
# ('TOM', 18)
user_info('TOM', 18)
  • 包裹关键字传递
def user_info(**kwargs):
    print(kwargs)


# {'name': 'TOM', 'age': 18, 'id': 110}
user_info(name='TOM', age=18, id=110)

6、高阶函数

把函数作为参数传入,这样的函数称为高阶函数,高阶函数是函数式编程的体现。函数式编程就是指这种高度抽象的编程范式。

6.1 map(func, lst)

map(func, lst),将传入的函数变量func作用到lst变量的每个元素中,并将结果组成新的列表(Python2)/迭代器(Python3)返回。

# 需求:计算`list1`序列中各个数字的2次方。
list1 = [1, 2, 3, 4, 5]


def func(x):
    return x ** 2


result = map(func, list1)

print(result)  # <map object at 0x0000013769653198>
print(list(result))  # [1, 4, 9, 16, 25]

6.2 reduce(func, lst)

reduce(func,lst),其中func必须有两个参数。每次func计算的结果继续和序列的下一个元素做累积计算。注意:reduce()传入的参数func必须接收2个参数

# 需求:计算`list1`序列中各个数字的累加和。
import functools
list1 = [1, 2, 3, 4, 5]

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

result = functools.reduce(func, list1)
print(result)  # 15

6.3 filter(func, lst)

​ filter(func, lst)函数用于过滤序列, 过滤掉不符合条件的元素, 返回一个 filter 对象。如果要转换为列表, 可以使用 list() 来转换。

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


def func(x):
    return x % 2 == 0


result = filter(func, list1)

print(result)  # <filter object at 0x0000017AF9DC3198>
print(list(result))  # [2, 4, 6, 8, 10]

7、lambda表达式

7.1 应用场景

如果一个函数有一个返回值,并且只有一句代码,可以使用lambda简化。

7.2 lambda语法

lambda 参数列表:表达式

注意

  • lambda表达式的参数可有可无,函数的参数在lambda表达式中完全适用。
  • lambda表达式能接受任何数量的参数但是只能返回一个表达式的值。

7.3 lambda的参数形式

(1)无参数

fn1 = lambda: 100
print(fn1())

(2)一个参数

fn2 = lambda a : a
print(fn2("这是一个匿名表达式"))

(3)默认参数

fn1 = lambda a, b, c=100: a + b + c
print(fn1(10, 20))

*(4)可变参数:args

fn1 = lambda *args: args
print(fn1(10, 20, 30))

**(5)可变参数:kwargs

fn1 = lambda **kwargs: kwargs
print(fn1(name='python', age=20))

7.4 lambda的应用

(1)带判断的lambda

fn1 = lambda a, b: a if a > b else b
print(fn1(1000, 500))

(2)列表数据按字典key的值排序

students = [
    {'name': 'TOM', 'age': 20},
    {'name': 'ROSE', 'age': 19},
    {'name': 'Jack', 'age': 22}
]

# 按name值升序排列
students.sort(key=lambda x: x['name'])
print(students)

# 按name值降序排列
students.sort(key=lambda x: x['name'], reverse=True)
print(students)

# 按age值升序排列
students.sort(key=lambda x: x['age'])
print(students)

8、global 和nonlocal 关键字

  • 修改全局变量适用global关键字

    num = 1
    def fun1():
        global num  # 需要使用 global 关键字声明
        print(num) 
        num = 123
        print(num)
    fun1()
    print(num)
    
  • 修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了

    def outer():
        num = 10
        def inner():
            nonlocal num   # nonlocal关键字声明
            num = 100
            print(num)
        inner()
        print(num)
    outer()
    

四、条件控制语句和循环结构

1、条件控制语句

  • 语法:
# 单行判断
if 条件:
    条件成立执行的代码1
    条件成立执行的代码2
    ......
   
# if ... else ...
 if 条件:
    条件成立执行的代码1
    条件成立执行的代码2
    ......
else:
    条件不成立执行的代码1
    条件不成立执行的代码2
    ......
# 多重判断  
if 条件1:
    条件1成立执行的代码1
    条件1成立执行的代码2
    ......
elif 条件2:
	条件2成立执行的代码1
    条件2成立执行的代码2
    ......
......
else:
    以上条件都不成立执行执行的代码
    
# if 嵌套
if 条件1:
    条件1成立执行的代码
    if 条件2:
        条件2成立执行的代码
        ....

2、循环控制语句

  • 循环的作用:控制代码重复执行
  • while语法
while 条件:
    条件成立重复执行的代码1
    条件成立重复执行的代码2
    ......
  • while循环嵌套语法
while 条件1:
    条件1成立执行的代码
    ......
    while 条件2:
        条件2成立执行的代码
        ......
  • for循环语法
for 临时变量 in 序列:
    重复执行的代码1
    重复执行的代码2
    ......
  • break退出整个循环
  • continue退出本次循环,继续执行下一次重复执行的代码
  • else
    • while和for都可以配合else使用
    • else下方缩进的代码含义:当循环正常结束后执行的代码
    • break终止循环不会执行else下方缩进的代码
    • continue退出循环的方式执行else下方缩进的代码

五、面向对象

类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

**方法:**类中定义的函数。

**类变量:**类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。

**数据成员:**类变量或者实例变量用于处理类及其实例对象的相关的数据。

**方法重写:**如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

**局部变量:**定义在方法中的变量,只作用于当前实例的类。

**实例变量:**在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。

**继承:**即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。

**实例化:**创建一个类的实例,类的具体对象。

**对象:**通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。

魔法方法

#  __init__()方法
"""
方法的作用:初始化对象
注意点:
		在创建一个对象时默认被调用,不需要手动调用
		__init__(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递过去。
"""
class Washer():
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def print_info(self):
        print(f'洗衣机的宽度是{self.width}')
        print(f'洗衣机的高度是{self.height}')


haier1 = Washer(10, 20)
haier1.print_info()


haier2 = Washer(30, 40)
haier2.print_info()

# __str__()
"""
当使用print输出对象的时候,默认打印对象的内存地址。如果类定义了`__str__`方法,那么就会打印从在这个方法中 return 的数据。
"""
class Washer():
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def __str__(self):
        return '这是海尔洗衣机的说明书'


haier1 = Washer(10, 20)
# 这是海尔洗衣机的说明书
print(haier1) 

# __del__()
"""
当删除对象时,python解释器也会默认调用`__del__()`方法。
"""
class Washer():
    def __init__(self, width, height):
        self.width = width
        self.height = height

    def __del__(self):
        print(f'{self}对象已经被删除')


haier1 = Washer(10, 20)

# <__main__.Washer object at 0x0000026118223278>对象已经被删除
del haier1

类方法

  • 需要用装饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数。
  • 当方法中 需要使用类对象 (如访问私有类属性等)时,定义类方法
  • 类方法一般和类属性配合使用
class Dog(object):
    __tooth = 10

    @classmethod
    def get_tooth(cls):
        return cls.__tooth


wangcai = Dog()
result = wangcai.get_tooth()
print(result)  # 10

静态方法:

  • 需要通过装饰器@staticmethod来进行修饰,静态方法既不需要传递类对象也不需要传递实例对象(形参没有self/cls)

  • 静态方法 也能够通过 实例对象类对象 去访问。

  • 当方法中 既不需要使用实例对象(如实例对象,实例属性),也不需要使用类对象 (如类属性、类方法、创建实例等)时,定义静态方法

  • 取消不需要的参数传递,有利于 减少不必要的内存占用和性能消耗

    class Dog(object):
        @staticmethod
        def info_print():
            print('这是一个狗类,用于创建狗实例....')
    
    
    wangcai = Dog()
    # 静态方法既可以使用对象访问又可以使用类访问
    wangcai.info_print()
    Dog.info_print()
    

1、继承

(1)继承的概念

# 经典类:不由任意内置类型派生出的类,称之为经典类
class 类名:
    代码
    ......

# 新式类 在python中默认继承object类,object类是顶级类或基类;其他子类叫做派生类
class 类名(object):
  代码

(2)单继承

# 1. 师父类
class Master(object):
    def __init__(self):
        self.kongfu = '[古法煎饼果子配方]'

    def make_cake(self):
        print(f'运用{self.kongfu}制作煎饼果子')

        
# 2. 徒弟类
class Prentice(Master):
    pass


# 3. 创建对象daqiu
daqiu = Prentice()
# 4. 对象访问实例属性
print(daqiu.kongfu)
# 5. 对象调用实例方法
daqiu.make_cake()

(3)多继承

多继承是一个类同事继承了多个父类

注意:当一个类有多个父类的时候,默认使用第一个父类的同名属性和方法

class Master(object):
    def __init__(self):
        self.kongfu = '[古法煎饼果子配方]'

    def make_cake(self):
        print(f'运用{self.kongfu}制作煎饼果子')


# 创建学校类
class School(object):
    def __init__(self):
        self.kongfu = '[黑马煎饼果子配方]'

    def make_cake(self):
        print(f'运用{self.kongfu}制作煎饼果子')


class Prentice(School, Master):
    pass


daqiu = Prentice()
print(daqiu.kongfu)
daqiu.make_cake()

(4)多层继承

class Master(object):
    def __init__(self):
        self.kongfu = '[古法煎饼果子配方]'

    def make_cake(self):
        print(f'运用{self.kongfu}制作煎饼果子')


class School(object):
    def __init__(self):
        self.kongfu = '[黑马煎饼果子配方]'

    def make_cake(self):
        print(f'运用{self.kongfu}制作煎饼果子')


class Prentice(School, Master):
    def __init__(self):
        self.kongfu = '[独创煎饼果子配方]'

    def make_cake(self):
        self.__init__()
        print(f'运用{self.kongfu}制作煎饼果子')

    def make_master_cake(self):
        Master.__init__(self)
        Master.make_cake(self)

    def make_school_cake(self):
        School.__init__(self)
        School.make_cake(self)


# 徒孙类
class Tusun(Prentice):
    pass


xiaoqiu = Tusun()

xiaoqiu.make_cake()

xiaoqiu.make_school_cake()

xiaoqiu.make_master_cake()

(5)子类重写父类同名方法和属性

子类和父类具有同名属性和方法,默认使用子类的同名属性和方法。

class Master(object):
    def __init__(self):
        self.kongfu = '[古法煎饼果子配方]'

    def make_cake(self):
        print(f'运用{self.kongfu}制作煎饼果子')


class School(object):
    def __init__(self):
        self.kongfu = '[黑马煎饼果子配方]'

    def make_cake(self):
        print(f'运用{self.kongfu}制作煎饼果子')


# 独创配方
class Prentice(School, Master):
    def __init__(self):
        self.kongfu = '[独创煎饼果子配方]'

    def make_cake(self):
        print(f'运用{self.kongfu}制作煎饼果子')


daqiu = Prentice()
print(daqiu.kongfu)
daqiu.make_cake()

(6)子类调用父类同名方法和属性

class Master(object):
    def __init__(self):
        self.kongfu = '[古法煎饼果子配方]'

    def make_cake(self):
        print(f'运用{self.kongfu}制作煎饼果子')


class School(object):
    def __init__(self):
        self.kongfu = '[黑马煎饼果子配方]'

    def make_cake(self):
        print(f'运用{self.kongfu}制作煎饼果子')


class Prentice(School, Master):
    def __init__(self):
        self.kongfu = '[独创煎饼果子配方]'

    def make_cake(self):
        # 如果是先调用了父类的属性和方法,父类属性会覆盖子类属性,故在调用属性前,先调用自己子类的初始化
        self.__init__()
        print(f'运用{self.kongfu}制作煎饼果子')

    # 调用父类方法,但是为保证调用到的也是父类的属性,必须在调用方法前调用父类的初始化
    def make_master_cake(self):
        Master.__init__(self)
        Master.make_cake(self)

    def make_school_cake(self):
        School.__init__(self)
        School.make_cake(self)


daqiu = Prentice()

daqiu.make_cake()

daqiu.make_master_cake()

daqiu.make_school_cake()

daqiu.make_cake()

(7)super()调用父类方法

class Master(object):
    def __init__(self):
        self.kongfu = '[古法煎饼果子配方]'

    def make_cake(self):
        print(f'运用{self.kongfu}制作煎饼果子')


class School(Master):
    def __init__(self):
        self.kongfu = '[黑马煎饼果子配方]'

    def make_cake(self):
        print(f'运用{self.kongfu}制作煎饼果子')

        # 方法2.1
        # super(School, self).__init__()
        # super(School, self).make_cake()

        # 方法2.2
        super().__init__()
        super().make_cake()


class Prentice(School):
    def __init__(self):
        self.kongfu = '[独创煎饼果子技术]'

    def make_cake(self):
        self.__init__()
        print(f'运用{self.kongfu}制作煎饼果子')

    # 子类调用父类的同名方法和属性:把父类的同名属性和方法再次封装
    def make_master_cake(self):
        Master.__init__(self)
        Master.make_cake(self)

    def make_school_cake(self):
        School.__init__(self)
        School.make_cake(self)

    # 一次性调用父类的同名属性和方法
    def make_old_cake(self):
        # 方法一:代码冗余;父类类名如果变化,这里代码需要频繁修改
        # Master.__init__(self)
        # Master.make_cake(self)
        # School.__init__(self)
        # School.make_cake(self)

        # 方法二: super()
        # 方法2.1 super(当前类名, self).函数()
        # super(Prentice, self).__init__()
        # super(Prentice, self).make_cake()

        # 方法2.2 super().函数()
        super().__init__()
        super().make_cake()


daqiu = Prentice()

daqiu.make_old_cake()

2、多态

多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承)。

  • 定义:多态是一种使用对象的方式,子类重写父类方法,调用不同子类对象的相同父类方法,可以产生不同的执行结果

  • 好处:调用灵活,有了多态,更容易编写出通用的代码,做出通用的编程,以适应需求的不断变化!

  • 实现步骤:

    • 定义父类,并提供公共方法
    • 定义子类,并重写父类方法
    • 传递子类对象给调用者,可以看到不同子类执行效果不同
    class Dog(object):
        def work(self):  # 父类提供统一的方法,哪怕是空方法
            print('指哪打哪...')
    
    
    class ArmyDog(Dog):  # 继承Dog类
        def work(self):  # 子类重写父类同名方法
            print('追击敌人...')
    
    
    class DrugDog(Dog):
        def work(self):
            print('追查毒品...')
    
    
    class Person(object):
        def work_with_dog(self, dog):  # 传入不同的对象,执行不同的代码,即不同的work函数
            dog.work()
    
    
    ad = ArmyDog()
    dd = DrugDog()
    
    daqiu = Person()
    daqiu.work_with_dog(ad)
    daqiu.work_with_dog(dd)
    

3、封装

定义私有属性和方法

设置私有权限的方法:在属性名和方法名前加上两个下划线。注意:私有属性和私有方法只能在类里面访问和修改。

  • 语法
class 类名():
  # 私有属性
  __属性名 =# 私有方法
  def __函数名(self):
    代码
  • 实例

    class Master(object):
        def __init__(self):
            self.kongfu = '[古法煎饼果子配方]'
    
        def make_cake(self):
            print(f'运用{self.kongfu}制作煎饼果子')
    
    
    class School(object):
        def __init__(self):
            self.kongfu = '[黑马煎饼果子配方]'
    
        def make_cake(self):
            print(f'运用{self.kongfu}制作煎饼果子')
    
    
    class Prentice(School, Master):
        def __init__(self):
            self.kongfu = '[独创煎饼果子配方]'
            # 定义私有属性
            self.__money = 2000000
    
        # 定义私有方法
        def __info_print(self):
            print(self.kongfu)
            print(self.__money)
    
        def make_cake(self):
            self.__init__()
            print(f'运用{self.kongfu}制作煎饼果子')
    
        def make_master_cake(self):
            Master.__init__(self)
            Master.make_cake(self)
    
        def make_school_cake(self):
            School.__init__(self)
            School.make_cake(self)
    
    
    # 徒孙类
    class Tusun(Prentice):
        pass
    
    
    daqiu = Prentice()
    # 对象不能访问私有属性和私有方法
    # print(daqiu.__money)
    # daqiu.__info_print()
    
    xiaoqiu = Tusun()
    # 子类无法继承父类的私有属性和私有方法
    # print(xiaoqiu.__money)  # 无法访问实例属性__money
    # xiaoqiu.__info_print()
    

七、文件操作

1、文件基本操作

1.1 打开文件

  • ​ 语法:

    open(name, mode)
    name: 是要打开目标文件名的字符串(或者文件所在的具体路径)
    mode: 设置打开文件的模式(访问模式):只读、写入、追加等。
    

    打开文件的模式:

    模式描述
    r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
    r+打开一个文件用于读写。文件指针将会放在文件的开头。
    rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
    w打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    w+打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    wb+以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
    a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

1.2 写文件

  • 语法:

    文件对象.write('内容')
    
    # 1、打开文件
    f = open('文件名','w')
    # 2、文件写入
    f.write('helloworld')
    # 3、关闭文件
    f.close()
    

    注意:

    1、w和a模式:如果文件不存在则创建新文件;如果文件存在,w模式先清空再写入,a模式直接末尾追加。

    2、r模式:如果文件不存在则报错

1.3 读文件

  • read()

    文件对象.read(num)
    
    num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据
    
  • readlines()

    readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。

    f = open('test.txt')
    
    content = f.readlines()
    
    print(content)
    
    f.close()
    
  • readline()

    readline()一次读取一行内容

    f = open('test.txt')
    
    content = f.readline()
    print(f'第一行:{content}')
    
    content = f.readline()
    print(f'第二行:{content}')
    
    # 关闭文件
    f.close()
    

    seek()

    作用:用来移动文件指针。

    文件对象.seek(偏移量, 起始位置)
    
    起始位置: 0文件开头 1当前位置 2文件末尾
    

    1.4 关闭

    文件对象.close()
    

2、文件备份

需求:用户输入当前目录下任意文件名,程序完成对该文件的备份功能(备份文件名为xx[备份]后缀,例如:test[备份].txt)。

  1. 接收用户输入目标文件名
old_name = input('请输入您要备份的文件名:')
  1. 规划备份文件名

    2.1 提取目标文件后缀

    2.2 组织备份的文件名,xx[备份]后缀

# 2.1 提取文件后缀点的下标
index = old_name.rfind('.')

# print(index)  # 后缀中.的下标

# print(old_name[:index])  # 源文件名(无后缀)

# 2.2 组织新文件名 旧文件名 + [备份] + 后缀
new_name = old_name[:index] + '[备份]' + old_name[index:]

# 打印新文件名(带后缀)
# print(new_name)
  1. 备份文件写入数据

    3.1 打开源文件 和 备份文件

    3.2 将源文件数据写入备份文件

    3.3 关闭文件

# 3.1 打开文件
old_f = open(old_name, 'rb')
new_f = open(new_name, 'wb')

# 3.2 将源文件数据写入备份文件
while True:
    con = old_f.read(1024)
    if len(con) == 0:
        break
    new_f.write(con)

# 3.3 关闭文件
old_f.close()
new_f.close()

3、文件和文件夹的基本操作

  1. 导入模块

    import os
    
  2. 文件重命名

    os.rename(目标文件名, 新文件名)
    
  3. 删除文件

    os.remove(目标文件名)
    
  4. 创建文件夹

    os.mkdir(文件夹名字)
    
  5. 获取当前目录

    os.getcwd()
    
  6. 改变默认目录

    os.chdir(目录)
    
  7. 获取目录列表

    os.listdir(目录)
    

8.删除文件夹

os.rmdir(文件夹名字)

如果文件不存在则创建新文件;如果文件存在,w模式先清空再写入,a模式直接末尾追加。**

2、r模式:如果文件不存在则报错

1.3 读文件

  • read()

    文件对象.read(num)
    
    num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据
    
  • readlines()

    readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。

    f = open('test.txt')
    
    content = f.readlines()
    
    print(content)
    
    f.close()
    
  • readline()

    readline()一次读取一行内容

    f = open('test.txt')
    
    content = f.readline()
    print(f'第一行:{content}')
    
    content = f.readline()
    print(f'第二行:{content}')
    
    # 关闭文件
    f.close()
    

    seek()

    作用:用来移动文件指针。

    文件对象.seek(偏移量, 起始位置)
    
    起始位置: 0文件开头 1当前位置 2文件末尾
    

    1.4 关闭

    文件对象.close()
    

2、文件备份

需求:用户输入当前目录下任意文件名,程序完成对该文件的备份功能(备份文件名为xx[备份]后缀,例如:test[备份].txt)。

  1. 接收用户输入目标文件名
old_name = input('请输入您要备份的文件名:')
  1. 规划备份文件名

    2.1 提取目标文件后缀

    2.2 组织备份的文件名,xx[备份]后缀

# 2.1 提取文件后缀点的下标
index = old_name.rfind('.')

# print(index)  # 后缀中.的下标

# print(old_name[:index])  # 源文件名(无后缀)

# 2.2 组织新文件名 旧文件名 + [备份] + 后缀
new_name = old_name[:index] + '[备份]' + old_name[index:]

# 打印新文件名(带后缀)
# print(new_name)
  1. 备份文件写入数据

    3.1 打开源文件 和 备份文件

    3.2 将源文件数据写入备份文件

    3.3 关闭文件

# 3.1 打开文件
old_f = open(old_name, 'rb')
new_f = open(new_name, 'wb')

# 3.2 将源文件数据写入备份文件
while True:
    con = old_f.read(1024)
    if len(con) == 0:
        break
    new_f.write(con)

# 3.3 关闭文件
old_f.close()
new_f.close()

3、文件和文件夹的基本操作

  1. 导入模块

    import os
    
  2. 文件重命名

    os.rename(目标文件名, 新文件名)
    
  3. 删除文件

    os.remove(目标文件名)
    
  4. 创建文件夹

    os.mkdir(文件夹名字)
    
  5. 获取当前目录

    os.getcwd()
    
  6. 改变默认目录

    os.chdir(目录)
    
  7. 获取目录列表

    os.listdir(目录)
    

8.删除文件夹

os.rmdir(文件夹名字)
  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值