Python 基础语法 字面量 定义: 在代码中,被写下来的固定的值 ,称之为字面量 。
字符串 字符串(String) ,又称文本,是由任意数量的字符如中文、英文、各类符号、数字等组成,所以叫字符的串。
Python中,字符串需要用双引号 包围起来,或者说,被双引号包围起来的,都是字符串。
1 2 3 4 5 6 7 8 666 66.6 "黑马程序员" print (666 )print (66.6 )print ("黑马程序员" )
注释
注:一般多行注释只写在文档开头,其余的用 """
或 '''
定义的都会被识别成普通字符串。
变量
1 2 money = 100 print ("钱包还剩:" , money, "元" )
拓展: 在变量中,等号右边可以进行加减乘除等符号运算。
数据类型
如何查看数据类型?
语法:type(被查看类型的数据或变量名)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 print (type ("黑马程序员" )) print (type (666 )) print (type (10.22 )) A = type ("黑马程序员" ) B = type (666 ) C = type (10.22 ) print (A) print (B) print (C) name = "黑马程序员" print (type (name))
注意:变量本身无类型,但是变量存储的数据是有类型的
类型转换 常见的转换语句
类型转换注意事项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 num_str = str (11 ) print (type (num_str), num_str) num_float = str (10.22 ) print (type (num_float), num_float) str1 = int ("11" ) print (type (str1), str1) str2 = float ("10.22" ) print (type (str2), str2) f = float (11 ) print (type (f), f) i = int (10.22 ) print (type (i), i)
标识符 定义:变量名、常量名、函数名、数组名 等等,都是为了区分程序中不同的实体、人为起定的名字。通常把这些名字叫做标识符 。
注意: 不遵守规则 :会出现问题
不遵守规范 :会不太高级
运算符
字符串扩展 字符串的三种定义方式
1 2 3 4 5 6 7 8 9 10 11 12 name = "黑马程序员" name = "黑马程序员" name = """黑马程序员""" name = "\"黑马程序员\"and\"白马程序员\"" print (name)name = '\'黑马程序员\'' print (name)name = "'黑马程序员'" print (name)
Python中字符串的单引号和双引号没有什么本质区别,如果想输出单引号,如Let's go!!!,外面就用双引号,否则要用转义字符;如果想输出双引号,如他是个“活雷锋”,外面就用单引号,否则就要有转义字符。
自动格式化 方法一:随时格式化
下载black 插件: 在终端 输入 pip install black
在设置中配置
测试:name = abc
,在等号前面多输入几个空格,看看是否会自动格式化
如果能正确运行,在PyCharm下方应该会显示:正在运行 File Watcher ‘代码规范Black’…
如果想要关闭Black插件自动格式化,在设置-工具-File Watcher中,取消勾选即可。
方法二:自动保存时格式化(建议)
字符串的拼接 方法:用+号连接
1 2 3 4 name = "眯眯" age = 3 print ("我的名字叫" + name + ",我今年" + str (age) + "岁了。" )
缺点: 1. 字符串无法和非字符串变量进行拼接,因为类型不一致,无法接上,需要进行类型转换。
2. 如果需要拼接的变量太多,会导致拼起来麻烦,看起来冗长
字符串格式化 1 2 3 4 name = "眯眯" age = 3 print ("我的名字叫%s,我今年%d岁了。" % (name, age))
1 2 3 PI = 3.14 print ("圆周率是%f" % PI)
1 2 3 PI = 3.14 print ("圆周率是%.2f" % PI)
快速写法 在Python 3.6及以上的版本中,引入了f-string ,是一种更简洁更易读的字符串格式化方式。
语法: print(f"{变量}") # 单引号和双引号都可以
1 2 3 4 5 6 name = "祖冲之" PI = 3.141592653589793 num = 7 print (f"我国杰出数学家{name} 算出圆周率的真值约为{PI:.7 f} ,相当于精确到第{num} 位。" )
优点: 1. 不用理会数据类型
2. 不需要做精度控制
数据输入
1 2 3 4 5 6 7 8 9 10 11 name = input ("请你输入你的名字:" ) print (f"Wow!{name} ,你的名字真好听!" )age = input ("请你输入你的年龄:" ) print (f"输入整数类型,输出的数据类型是{type (age)} " )age = int (input ("请你输入你的年龄:" )) print (f"输入整数类型,输出的数据类型是{type (age)} " )
Python 判断语句 布尔类型
就是说,布尔类型只有两个结果,True or False ,我们可以把这个结果存储给一个变量名。
此外,布尔类型不仅可以自行定义,同时也可以通过计算的来。也就是使用比较运算符 进行比较运算得到布尔类型的结果。
1 2 3 4 5 6 7 result = 5 > 2 print (f"判断 5>2 输出的结果是{result} ,它的数据类型是{type (result)} " )result = "itcast" == "itcat" print (f"判断两个字符串相等 输出的结果是{result} ,它的数据类型是{type (result)} " )
这里我们能很明显看出运算符之间也是有优先级 的,但也不用可以去记忆,大不了给先运算的加小括号 就是了。
运算符优先级(由高到低)
运算符
描述
**
指数
~、+、-
按位翻转、一元加号、一元减号
*、/、%、//
乘、除、取模和取整除
+、-
加法和减法
>>、<<
右移、左移运算符
&
位与运算符
^、|
位异或运算符、位或运算符
<=、<、>、>=
比较运算符
<>、==、!=
等于运算符
=、%=、/=、//=、-=、+=、=、* =
赋值运算符
is、is not
身份运算符
in、not in
成员运算符
and、or、not
逻辑运算符
注: 小括号 是绝对的Top级别选手,还在指数上面。
按位翻转 是指将一个整数的二进制表示中的0变为1,1变为0。
一元加号减号 就是数字前面的正负号。
等于运算符中的 <> 表示不等于,在Python3.0及以后的版本已经不能用了。
位运算(Bitwise Operations)是计算机处理二进制位(0 和 1)的操作。
& 当两个相应的二进制位,都为1,则该位的结果为1,否则为0。
^ 当两个相应的二进制位,相异时,结果为1
| 当两个相应的二进制位,有一个为1时,结果位就为1。
比较运算符
if 语句
注: 判断语句 的结果,必须是布尔类型 True 或 False
True 会执行if内的代码语句,False 则不会执行。
1 2 3 4 5 6 7 age = int (input ("请输入你的年龄:" )) if age >= 18 : print ("我成年啦!我可以去网吧通宵啦!" ) print (f"我今年已经{age} 岁了。" )
if else 语句
1 2 3 4 5 6 7 8 9 10 print ("欢迎来到融创乐园,本园儿童免费,成人收费!" )age = int (input ("请输入您的年龄:" )) if age >= 18 : print ("您已成年,需要购票10元。" ) else : print ("您未成年,可以免费游玩。" ) print ("祝您游玩愉快!" )
if elif else 语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 print ("欢迎来到融创乐园!" )day = int (input ("请输入今天是周几(1~7):" )) vip_level = int (input ("请输入您的VIP等级(1~5):" )) height = int (input ("请输入你的身高(cm):" )) if day == 7 : print ("今天是周日,可以免票。" ) elif vip_level > 3 and vip_level <= 5 : print ("VIP等级大于3,可以免票。" ) elif height < 120 : print ("身高小于120cm,可以免票。" ) else : print ("不好意思,您需要进行购票,票价为10元/人。" ) print ("祝您玩得愉快!" )
视频中,判断的顺序并不合理,需要调换一下优先级,下面的代码更能体现。
input输入语句直接写入判断条件中
1 2 3 4 5 6 7 8 9 10 11 print ("欢迎来到融创乐园!" )if int (input ("请输入今天是周几(1~7):" )) == 7 : print ("今天是周日,可以免票。" ) elif int (input ("请输入您的VIP等级(1~5):" )) > 3 : print ("VIP等级大于3,可以免票。" ) elif int (input ("请输入你的身高(cm):" )) < 120 : print ("身高小于120cm,可以免票。" ) else : print ("不好意思,您需要进行购票,票价为10元/人。" ) print ("祝您玩得愉快!" )
优点: 节省代码量,判断成立后就不需要进行多余的输入。
缺点: 弊端如第四行的代码,没法再次进行&的判断,最好还是赋值给一个变量,也不容易出错,也方便修改。
判断语句的嵌套
嵌套的示例还是不适合用刚刚游乐园的例子,因为游乐园免票有明显的优先级,周日>身高和VIP,现在又限定VIP优先级大于身高,直接按顺序if即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 """ 领取礼物标准: 1. 18-30岁的成年人 2. 工龄大于两年,或者职级大于3 """ age = int (input ("请输入您的年龄:" )) year = int (input ("请输入您的工龄:" )) level = int (input ("请输入您的职级:" )) if age >= 18 and age <= 30 : if year > 2 or level > 3 : print ("恭喜你,可以成功领取礼物!" ) else : print ("很抱歉,年龄达标,但是工龄和职级有不达标的,无法领取礼物~" ) else : print ("很抱歉,年龄不达标~" )
随机数 通过如下代码,可以定义一个变量num,变量内存储随机数字。
1 2 3 import randomnum = random.randint(1 , 100 )
Python 循环语句 while循环语句
while循环的注意点
while循环的嵌套
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 """ 打印输出九九乘法表 """ i = 1 while i <= 9 : j = 1 while j <= i: print ( f"{j} *{i} ={j*i} " , end="\t" ) j += 1 print () i += 1
for循环
for循环注意点
range语句
for循环的变量作用域 1 2 3 for i in range (3 ): print (i) print (i)
在上面这段程序中,i 是初始化在for循环中的,那么他只能作用在for的循环体内 最后一行也能输出,是因为程序在编译的时候是从上往下编译的,前面定义了 i,且最后被赋值2, 所以 print(i) 会再次输出2 ,但这是不规范的
1 2 3 4 i = 0 for i in range (3 ): print (i) print (i)
当 i 初始化在 for 循环外面,那么最后的 print(i) 就不会被警告,能正常规范地输出。
for循环的嵌套 1 2 3 4 5 6 7 8 """ 打印输出九九乘法表 """ for i in range (1 , 10 ): for j in range (1 , i + 1 ): print (f"{j} *{i} ={j*i} " , end="\t" ) print ()
continue & break
continue
1 2 3 4 for i in "123456" : if i == "4" : continue print (i, end="" )
break
1 2 3 4 for i in '123456' : if i == '4' : break print (i, end='' )
注意:在嵌套循环中,continue和break只能作用在所在循环 ,无法对上层循环起作用。
Python 函数
优点:将功能封装在函数内,可供随时随地重复利用,提高代码的复用性,减少重复代码,提高开发效率
函数的定义
1 2 3 4 5 def say_hi (): print ('Hello World!' ) say_hi() say_hi()
函数的参数 传入参数 的功能是:在函数进行计算的时候,接受外部(调用时)提供的数据
语法解析
1 2 3 4 5 6 def student_id (i ): print (str (852006 ) + str (i).zfill(2 )) student_id(5 ) student_id(19 )
注意事项:
形参与实参
1 2 3 4 5 6 def student (x, y, z ): result = x + y + z print (f"{x} + {y} + {z} 的计算结果是:{result} " ) student(5 , 6 , 7 )
函数的返回值
语法格式
1 2 3 4 5 6 def add (a, b ): return a + b r = add(1 , 2 ) print (r)
None类型 Python中有一个特殊的字面量:None ,其类型是:
无返回值 的函数,实际上就是返回了 None 这个字面量,也就是返回了空的意思。
1 2 3 4 5 6 7 8 9 10 def say_hello (): print ("Hello World!" ) result = say_hello() print (result)print (type (result))
None 可以主动使用 return 返回,效果等同于不写 return 语句。
函数的说明文档 如何编写
parameter:参数
如何查看
函数的嵌套调用
变量的作用域
局部变量
全局变量
global 关键字
进阶:函数的多返回值
1 2 3 4 5 6 7 def test_return (): return 1 , "hello" , True x, y, z = test_return() print (x)print (y)print (z)
进阶:函数的多种传参方式
位置参数
1 2 3 4 5 def user_info (name, age, gender ): print (f"姓名:{name} , 年龄:{age} , 性别:{gender} " ) user_info("陈平安" , 30 , "男" )
关键字参数
1 2 3 4 5 6 7 def user_info (name, age, gender ): print (f"姓名:{name} , 年龄:{age} , 性别:{gender} " ) user_info(name="陆芝" , age=35 , gender="女" ) user_info(age=16 , gender="男" , name="李槐" ) user_info("赊月" , gender="女" , age=90 )
缺省参数
1 2 3 4 5 6 7 def user_info (name, age=99 , gender="沃尔玛购物袋" ): print (f"姓名:{name} , 年龄:{age} , 性别:{gender} " ) user_info("小赵" ) user_info("小钱" , 13 ) user_info("小孙" , 15 , "女" )
不定长参数
1 2 3 4 5 6 7 def user_info (*args ): print (f"args参数的类型是:{type (args)} ,内容是:{args} " ) user_info(1 , 2 , 3 , "小明" , "男孩" )
arguments (=args) :参数
1 2 3 4 5 6 def user_info (**kwargs ): print (f"args参数的类型是:{type (kwargs)} ,内容是:{kwargs} " ) user_info(name="小周" , age=11 , gender="男孩" )
keyword arguments (=kwargs):关键字参数
进阶:匿名函数 函数作为参数传递 1 2 3 4 5 6 7 8 9 def test_func (compute ): result = compute(1 , 2 ) print (f"compute参数的类型是:{type (compute)} " ) print (f"计算结果:{result} " ) def compute (x, y ): return x + y test_func(compute)
lambda匿名函数
1 2 3 4 5 6 7 8 def test_func (compute ): result = compute(1 , 2 ) print (f"结果是:{result} " ) def add (x, y ): return x + y test_func(add)
1 2 3 4 5 6 def test_func (compute ): result = compute(1 , 2 ) print (f"结果是:{result} " ) test_func(lambda x, y: x + y)
使用 def 和使用 lambda,定义的函数功能完全一致 ,只是 lambda 关键字定义的函数是匿名的 ,无法二次使用
Python 数据容器 定义:数据容器 是一种可以存储多个元素 的python数据类型,它有五类,分别是:list(列表)、tuple(元组)、str(字符串)、set(集合)、dict(字典) 。
list 列表 列表的定义
1 2 3 4 5 6 7 8 9 list = ["python" , 888 , 10.22 ] print (list ) print (type (list )) list = [[1 , 2 , 3 ], [4 , 5 , 6 ]]print (list ) print (type (list ))
列表的下标(索引)
列表的常用操作(方法)
方法和函数的区别 :(进阶篇的面向对象章节会具体讲,目前只需要知道如何调用 即可)
函数: 定义在模块级别 ,即它们不属于任何类 ,通过函数名直接调用 。
方法: 定义在类内部 ,它们属于类 ,通过类的实例或类本身调用 。
总览
编号
使用方式
作用
1
列表.index(元素)
查找指定元素在列表的下标,找不到则报错ValueError
2
列表.insert(下标, 元素)
在指定下标处,插入指定的元素
3
列表.append(元素)
向列表中追加一个元素
4
列表.extend(容器)
将数据容器的内容依次取出,追加到列表尾部
5
del 列表[下标]
删除列表指定下标元素
6
列表.pop(下标)
删除列表指定下标元素
7
列表.remove(元素)
从前向后,删除此元素第一个匹配项
8
列表.clear()
清空列表
9
列表.count(元素)
统计此元素在列表中出现的次数
10
len(列表)
统计列表i内有多少元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 list = ["Python" , "Java" , "CPP" ]index = list .index("Python" ) print (f"Python在列表中的下标索引值是:{index} " )list [0 ] = "Matlab" print (f"列表被修改元素值后,结果是:{list } " )list .insert(1 , 2024 ) print (f"列表插入元素后,结果是:{list } " )list .append("Ruby" )print (f"列表在追加了元素后,结果是:{list } " )list .append([777 , 888 , 999 ]) print (f"列表在追加了元素后,结果是:{list } " )list2 = [1 , 2 , 3 ] list .extend(list2)print (f"列表在追加了一个新的列表后,结果是:{list } " )list = ["a" , "b" , "c" ]del list [2 ]print (f"列表删除元素后结果是:{list } " )list = ["a" , "b" , "c" ]element = list .pop(2 ) print (f"通过pop方法取出元素后列表内容:{list } , 取出的元素是:{element} " )list = ["t" , "a" , "n" , "g" , "s" , "h" , "a" , "o" ]list .remove("a" )print (f"通过remove方法移除元素后,列表的结果是:{list } " )list .clear()print (f"列表被清空了,结果是:{list } " )list = ["a" , "b" , "a" , "d" , "a" , "f" , "a" , "h" , "a" , "j" ]count = list .count("a" ) print (f"列表中a的数量是:{count} " )list = ["a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" , "x" , "t" ]count = len (list ) print (f"列表中的元素数量总共有:{count} 个" )
列表的遍历 既然数据容器可以存储多个元素,那么,就会有需求从容器内依次取出元素进行操作。
将容器内的元素依次取出 进行处理的行为,称之为:遍历、迭代 。
while循环 语法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 def list_while_func (): """ 使用while循环遍历列表的演示函数 :return: None """ my_list = [1 , 2 , 3 , 4 , 5 ] index = 0 while index < len (my_list): element = my_list[index] print (f"列表的元素: {element} " ) index += 1 list_while_func()
for循环 语法:
1 2 3 4 5 6 7 8 9 10 11 12 def list_for_func (): """ 使用while循环遍历列表的演示函数 :return: None """ my_list = [1 , 2 , 3 , 4 , 5 ] for element in my_list: print (f"列表的元素:{element} " ) list_for_func()
tuple 元组 不同点 列表 是可以修改 的,元组 一旦定义完成,就不可修改 ,相当于一个只读 的列表(list)。
元组的定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 t1 = (1 , "Hello" , True ) t2 = () t3 = tuple () print (f"t1的类型是:{type (t1)} , 内容是:{t1} " )print (f"t2的类型是:{type (t2)} , 内容是:{t2} " )print (f"t3的类型是:{type (t3)} , 内容是:{t3} " )t4 = ("hello" ,) print (f"t4的类型是:{type (t4)} , t4的内容是:{t4} " )t5 = ((1 , 2 , 3 ), (4 , 5 , 6 )) print (f"t5的类型是:{type (t5)} , 内容是:{t5} " )
元组的下标(索引)
元组的常用操作(方法) 总览
编号
操作
说明
1
元组.index(元素)
查找指定元素在元组的下标,找不到则报错ValueError
2
元组.count(元素)
统计此元素在元组中出现的次数
3
len(列表)
统计元组内有多少元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 t6 = ("Python" , "Java" , "CPP" ) index = t6.index("Python" ) print (f"在元组t6中查找Python的下标是:{index} " )t7 = ("a" , "b" , "a" , "d" , "a" , "f" , "a" , "h" , "a" , "j" ) num = t7.count("a" ) print (f"在元组t7中统计a的数量有:{num} 个" )t8 = ("a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" , "x" , "t" ) num = len (t8) print (f"t8元组中的元素有:{num} 个" )
元组的遍历
注意点 1 2 3 4 5 t9 = (1 , 2 , ["cat" , "dog" ]) print (f"t9的内容是:{t9} " )t9[2 ][0 ] = "猫" t9[2 ][1 ] = "狗" print (f"t9的内容是:{t9} " )
注意:元组内的元素不可以修改,但是如果元组内嵌套了列表(list),那么列表内的元素可以进修改。
str 字符串 字符串的定义
字符串的下标(索引)
字符串的常用操作(方法) 总览
编号
操作
说明
1
字符串[下标]
根据下标索引取出特定位置字符
2
字符串.index(字符串)
查找给定字符的第一个匹配项的下标
3
字符串.replace(字符串1, 字符串2)
将字符串内的全部字符串1,替换为字符串2,不会修改原字符串,而是增加一个新的字符串
4
字符串.split(字符串)
按照给定字符串,对字符串进行分隔,不会修改原字符串,而是增加一个新的列表
5
字符串.strip()、字符串.strip(字符串)
移除首尾的空格和换行符或指定字符串
6
字符串.count(字符串)
统计字符串内某字符串的出现次数
7
len(字符串)
统计字符串的字符个数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 str = "cat and dog" value = str .index("and" ) print (f"在字符串{str } 中查找and,其起始下标是:{value} " )new_str = str .replace("cat" , "mimi" ) print (f"将字符串{str } ,进行替换后得到:{new_str} " )str = "hello python and mimi" str_list = str .split(" " ) print (f"将字符串{str } 进行split切分后得到:{str_list} , 类型是:{type (str_list)} " )str = " aa bb cc dd " new_str = str .strip() print (f"字符串{str } 被strip后,结果:{new_str} " )str = "121122cat and dog222121" new_str = str .strip("12" ) print (f"字符串{str } 被strip('12')后,结果:{new_str} " )str = "11223311" left_str = str .lstrip("1" ) print (f"字符串{str } 被lstrip('1')后,结果:{left_str} " )str = "11223311" right_str = str .rstrip("1" ) print (f"字符串{str } 被rstrip('1')后,结果:{right_str} " )str = "Shanghai University and Yangzhou University" count = str .count("University" ) print (f"字符串{str } 中University出现的次数是:{count} " )str = "a & b" num = len (str ) print (f"字符串{str } 的长度是:{num} " )
字符串的遍历
不同点 相比于列表,字符串元素 是不可以修改 的,只能新建字符串,存储的数据类型 也只能是字符型 。
序列的切片
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 list = [0 , 1 , 2 , 3 , 4 , 5 , 6 ]result1 = list [1 :4 ] print (f"结果1:{result1} " )tuple = (0 , 1 , 2 , 3 , 4 , 5 , 6 )result2 = tuple [:] print (f"结果2:{result2} " )str = "01234567" result3 = str [::2 ] print (f"结果3:{result3} " )str = "01234567" result4 = str [::-1 ] print (f"结果4:{result4} " )list = [0 , 1 , 2 , 3 , 4 , 5 , 6 ]result5 = list [3 :1 :-1 ] print (f"结果5:{result5} " )tuple = (0 , 1 , 2 , 3 , 4 , 5 , 6 )result6 = tuple [::-2 ] print (f"结果6:{result6} " )
set 集合 不同点 列表 ,可修改、支持重复元素且有序
元组、字符串 ,不可修改、支持重复元素且有序
集合 ,最主要的特点 就是:不支持元素的重复(自带去重功能)、并且内容无序
集合的定义
集合的常用操作(方法) 总览:
编号
操作
说明
1
集合.add(元素)
集合内添加一个元素
2
集合.remove(元素)
移除集合内指定的元素
3
集合.pop()
从集合中随机取出一个元素
4
集合.clear()
将集合清空
5
集合1.difference(集合2)
得到一个新集合,内含2个集合的差集,原有的2个集合内容不变
6
集合1.difference_update(集合2)
在集合1中,删除集合2中存在的元素,集合1被修改,集合2不变
7
集合1.union(集合2)
得到1个新集合,内含2个集合的全部元素,原有的2个集合内容不变
8
len(集合)
得到一个整数,记录了集合的元素数量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 set_empty = set () print (f"set_empty的内容是:{set_empty} , 类型是:{type (set_empty)} " )set = { "Python" , "Java" , "CPP" , "Python" , "Java" , "CPP" , "Python" , "Java" , "CPP" , } print (f"set的内容是:{set } , 类型是:{type (set )} " )set .add(1022 )set .add(1022 ) print (f"set添加元素后结果是:{set } " )set .remove("CPP" )print (f"set移除CPP后,结果是:{set } " )set = {"Python" , "Java" , "CPP" }element = set .pop() print (f"集合被取出元素是:{element} , 取出元素后:{set } " )set .clear()print (f"集合被清空啦,结果是:{set } " )set1 = {1 , 2 , 3 } set2 = {1 , 5 , 6 } set3 = set1.difference(set2) print (f"取出差集后的结果是:{set3} " )print (f"取差集后,原有set1的内容:{set1} " )print (f"取差集后,原有set2的内容:{set2} " )set1 = {1 , 2 , 3 } set2 = {1 , 5 , 6 } set1.difference_update(set2) print (f"消除差集后,集合1结果:{set1} " )print (f"消除差集后,集合2结果:{set2} " )set1 = {1 , 2 , 3 } set2 = {1 , 5 , 6 } set3 = set1.union(set2) print (f"2集合合并结果:{set3} " )print (f"合并后集合1:{set1} " )print (f"合并后集合2:{set2} " )set1 = {1 , 2 , 3 , 4 , 5 , 1 , 2 , 3 , 4 , 5 } num = len (set1) print (f"集合内的元素数量有:{num} 个" )set1 = {1 , 2 , 3 , 4 , 5 } for element in set1: print (f"集合中的元素有:{element} " )
dict 字典 字典的定义
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 dict1 = {"枫原万叶" : 99 , "神里绫华" : 88 , "达达利亚" : 77 } dict2 = {} dict3 = dict () print (f"字典1的内容是:{dict1} , 类型:{type (dict1)} " )print (f"字典2的内容是:{dict2} , 类型:{type (dict2)} " )print (f"字典3的内容是:{dict3} , 类型:{type (dict3)} " )dict1 = { "枫原万叶" : 99 , "枫原万叶" : 88 , "达达利亚" : 77 , } print (f"重复key的字典的内容是:{dict1} " )dict1 = {"枫原万叶" : 99 , "神里绫华" : 88 , "达达利亚" : 77 } score = dict1["枫原万叶" ] print (f"枫原万叶的考试分数是:{score} " )score = dict1["神里绫华" ] print (f"神里绫华的考试分数是:{score} " )stu_score_dict = { "枫原万叶" : {"剑术" : 77 , "飞行" : 66 , "历史" : 33 }, "神里绫华" : {"剑术" : 88 , "飞行" : 86 , "历史" : 55 }, "达达利亚" : {"剑术" : 99 , "飞行" : 96 , "历史" : 66 }, } print (f"学生的考试信息是:{stu_score_dict} " )score = stu_score_dict["神里绫华" ]["剑术" ] print (f"神里绫华的剑术分数是:{score} " )score = stu_score_dict["达达利亚" ]["历史" ] print (f"达达利亚的历史分数是:{score} " )
字典的常用操作(方法) 总览
编号
操作
说明
1
字典[Key]
获取指定Key对应的Value值
2
字典[Key] = Value
添加或更新键值对
3
字典.pop(Key)
取出Key对应的Value并在字典内删除此Key的键值对
4
字典.clear()
清空字典
5
字典.keys()
获取字典的全部Key,可用于for循环遍历字典
6
len(字典)
计算字典内的元素数量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 dict = {"陈平安" : 99 , "齐静春" : 88 , "刘羡阳" : 77 }dict ["顾璨" ] = 66 print (f"字典经过新增元素后,结果:{dict } " )dict ["陈平安" ] = 80 print (f"字典经过更新元素后,结果:{dict } " )score = dict .pop("陈平安" ) print (f"字典中被移除了一个元素,结果:{dict } , 陈平安的拳法得分是:{score} " )dict .clear()print (f"字典被清空了,内容是:{dict } " )dict = {"陈平安" : 99 , "齐静春" : 88 , "刘羡阳" : 77 }keys = dict .keys() print (f"字典的全部keys是:{keys} " )print ("-----------------------" )for key in keys: print (f"字典的key是:{key} " ) print (f"字典的value是:{dict [key]} " ) print ("-----------------------" )for key in dict : print (f"字典的key是:{key} " ) print (f"字典的value是:{dict [key]} " ) print ("-----------------------" )num = len (dict ) print (f"字典中的元素数量有:{num} 个" )
5类数据容器对比
数据容器的通用操作 总览
编号
功能
描述
1
通用for循环
遍历容器(字典是遍历key)
2
len()
容器元素个数
3
max
容器内最大元素
4
min()
容器内最小元素
5
list()
转换为列表
6
str()
转换为字符串
7
tuple()
转换为元组
8
set()
转换为集合
9
sorted(序列, [reverse=True])
排序,reverse=True表示降序,得到一个排好序的列表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 list = [3 , 1 , 2 , 5 , 4 ]tuple = (3 , 1 , 2 , 5 , 4 )str = "bdcefga" set = {3 , 1 , 2 , 5 , 4 }dict = {"key3" : 1 , "key1" : 2 , "key2" : 3 , "key5" : 4 , "key4" : 5 }print (f"列表对象的排序结果:{sorted (list )} " )print (f"元组对象的排序结果:{sorted (tuple )} " )print (f"字符串对象的排序结果:{sorted (str )} " )print (f"集合对象的排序结果:{sorted (set )} " )print (f"字典对象的排序结果:{sorted (dict )} " )print (f"列表对象的反向排序结果:{sorted (list , reverse=True )} " )print (f"元组对象的反向排序结果:{sorted (tuple , reverse=True )} " )print (f"字符串对象反向的排序结果:{sorted (str , reverse=True )} " )print (f"集合对象的反向排序结果:{sorted (set , reverse=True )} " )print (f"字典对象的反向排序结果:{sorted (dict , reverse=True )} " )list1 = [3 , 1 , 2 , 5 , 4 ] list1.sort() print (list1)""" 普通的升序排序调用sorted()函数,会返回新的有序列表; 如果用list.sort()方法,它会原地修改原列表(并返回 None 以避免混淆)。 往往不如sorted()方便,但如果不需要原列表,用它会稍微高效一些 另一个区别是list.sort()方法只为列表定义,而sorted()函数接受任何可迭代对象。 """
在python 中,字符串比较基于字典序 (lexicographical order),即字符编码(如ASCII或Unicode)的比较 。
比较从第一个字符 开始,逐个字符进行比较,直到找到不同的字符或到达字符串的末尾 。
例如,”apple “ 小于 “banana” ,因为 “a “ 的ASCII值小于 “b “。
”abc000 “ 小于 “abd “,因为 “c “ 的ASCII值小于 “d “,一旦有了大小差异,便不再往后继续比较了。
Python 文件操作
打开文件
如图可知,open() 函数内置8个参数,encoding在第4位,不能直接用位置参数来传参。
mode常用模式
描述
r (read)
以只读 方式打开文件,文件的指针将会放在文件的开头,这是默认模式。
w (write)
打开一个文件只用于写入 ,如果该文件已存在则打开文件,并从开头开始编辑 ,原有内容会被删除 。 如果该文件不存在,创建新文件 ,谨慎使用 w 模式 。
a (append)
打开一个文件用于追加 。如果该文件已存在,新的内容将会被写入到已有内容之后 。 如果该文件不存在,创建新文件 进行写入。
1 2 3 4 5 6 7 8 9 f1 = open (r"D:\Desktop\abc.txt" , "r" , encoding="UTF-8" ) f2 = open ("D:\\Desktop\\abc.txt" , "r" , encoding="UTF-8" ) f3 = open ("D:/Desktop/abc.txt" , "r" , encoding="UTF-8" ) print (type (f1)) print (type (f2))print (type (f3))
读取文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 f = open (r"D:\Desktop\abc.txt" , "r" , encoding="UTF-8" ) print (f"读取10个字节的结果:{f.read(10 )} " ) """ 读取10个字节的结果:hello worl """ print (f"read方法读取全部内容的结果是:{f.read()} " )""" read方法读取全部内容的结果是:d Python Java 1022 """ print ("-----------------------------------------------" )lines = f.readlines() print (f"lines对象的类型:{type (lines)} " )print (f"lines对象的内容是:{lines} " ) f.close() f = open (r"D:\Desktop\abc.txt" , "r" , encoding="UTF-8" ) print (f"逐行输出对象的结果是:{f.readlines()} " )f.close() f = open (r"D:\Desktop\abc.txt" , "r" , encoding="UTF-8" ) line1 = f.readline() line2 = f.readline() line3 = f.readline() print (f"第一行数据是:{line1} " )print (f"第二行数据是:{line2} " )print (f"第三行数据是:{line3} " )f.close() f = open (r"D:\Desktop\abc.txt" , "r" , encoding="UTF-8" ) for line in f: print (f"每一行数据是:{line} " ) f.close()
1 2 3 4 with open (r"D:\Desktop\abc.txt" , "r" , encoding="UTF-8" ) as f: for line in f: print (f"每一行数据是:{line} " )
操作汇总
操作
功能
文件对象 = open(file, mode, encoding)
打开文件获得文件对象
文件对象.read(num)
读取指定长度字节,若不指定num,则会读取文件全部内容
文件对象.readline()
读取一行
文件对象.readlines()
读取全部行,得到列表
for line in 文件对象
for循环文件行,一次循环得到一行数据
文件对象.close()
关闭文件对象
with open() as f
通过with open语法打开文件,可以自动关闭
写入文件
1 2 3 4 5 6 7 8 f = open ("python.txt" , "w" , encoding="utf-8" ) f.write("Hello Python!" ) f.flush() f.close()
注意:
追加文件
1 2 3 4 5 f = open ("python.txt" , "a" , encoding="UTF-8" ) f.write("\nYou're a fake fan,I am Java!" ) f.close()
注意:
a 模式,文件不存在,会创建新文件
a 模式,文件存在,会在原有内容后面继续写入
可以使用 \n 来写出换行符
Python 异常、模块与包 异常 异常的定义
异常的捕获
1 2 3 4 try : f = open ("linux.txt" , "r" ) except : f = open ("linux.txt" , "w" )
1 2 3 4 5 6 7 try : name except NameError as e: print ("name变量名称未定义错误" ) print (e)
1 2 3 4 5 6 7 8 try : print (1 / 0 ) print (name) except (NameError, ZeroDivisionError) as e: print ("出现了变量未定义 或者 除以0的异常错误" ) print (e)
1 2 3 4 5 6 7 8 9 10 try : f = open ("123.txt" , "r" , encoding="UTF-8" ) except Exception as e: print ("出现异常了~" ) f = open ("123.txt" , "w" , encoding="UTF-8" ) else : print ("哈哈没有异常!" ) finally : print ("我是finally,有没有异常都需要执行!" ) f.close()
注意:
我们可以注意到except: 和 except Exception: 都可以捕获所有异常,但还是有所区别的,其中except可捕获所有异常 ,包括BaseException、SystemExit等,但使用需谨慎。except Exception用于处理普通异常 ,不包括BaseException等特殊异常,且except Exception后面可以接as e。
在编写代码时,推荐尽量捕获特定的异常 ,以提高代码的可读性和稳定性 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 def func1 (): print ("func1 开始执行" ) num = 1 / 0 print ("func1 结束执行" ) def func2 (): print ("func2 开始执行" ) func1() print ("func2 结束执行" ) def main (): try : func2() except Exception as e: print (f"出现异常了,异常的信息是:{e} " ) main() ''' 利用异常具有传递性的特点, 当我们想要保证程序不会因为异常而崩溃的时候, 就可以在main()函数中设置异常捕获, 由于无论在整个程序哪里发生异常, 最终都会传递到main()函数中, 这样就可以确保所有的异常都会被捕获。 '''
模块 模块的导入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 import time print ("你好" )time.sleep(5 ) print ("我好" )from time import sleepprint ("你好" )sleep(5 ) print ("我好" )from time import * print ("你好" )sleep(5 ) print ("我好" )import time as tprint ("你好" )t.sleep(5 ) print ("我好" )from time import sleep as slprint ("你好" )sl(5 ) print ("我好" )
注意:
自定义模块
1 2 3 def test (a, b ): print (f"{a} +{b} ={a+b} " )
1 2 3 def test (a, b ): print (f"{a} -{b} ={a-b} " )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 import my_module1 my_module1.test(1 , 2 ) from my_module1 import test test(1 , 2 ) from my_module1 import test from my_module2 import testtest(1 , 2 )
1 2 3 4 5 def test (a, b ): print (f"{a} +{b} ={a+b} " ) test(0 , 1 )
详解:
__name__是一个内置变量 ,用于表示当前模块的名字。
在Python底层设置中,当一个Python文件被直接运行 时,它的__name__值为__main__ ,我们可以通过print(__name__)
查看。
当该文件被导入到其他文件中时 ,它的__name__值则为该文件的名称 。
这个变量可以用来区分一个文件是被直接运行还是被导入到其他文件中。
所以上述 if 语句表示,只有当__name__的值是_main\ _时,才打印输出测试语句。
包 自定义包
1 2 3 def info_print1 (): print ("我是模块1" )
1 2 3 def info_print2 (): print ("我是模块2" )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import my_package.my_module1 import my_package.my_module2my_package.my_module1.info_print1() my_package.my_module2.info_print2() from my_package import my_module1from my_package import my_module2my_module1.info_print1() my_module2.info_print2() from my_package.my_module1 import info_print1from my_package.my_module2 import info_print2info_print1() info_print2()
第三方包
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple