本文最后更新于 2024-10-13T12:52:53+00:00
python笔记
pycharm常用快捷键
ctrl+alt+s
打开软件设置
ctrl+d
复制当前行代码
shift+alt+上/下
将当前行代码上移或下移
ctrl+shift+f10
运行当前代码文件
shift+f6
重命名文件
ctrl+a
全选
ctrl+f
搜索
ctrl+alt+L
reformat code
ctrl+alt+shift+L
reformat file
ctrl+/
注释选中行
1print语句
print()默认结尾换行,如果不需要换行可以添加end=‘’
1 2 print ("hello" , end='' )print ("world" )
1 2 print ("hello\tworld" )print ("hello\nworld" )
2.1字面量python六种数据类型
1 2 3 print (999 )print (114.514 )print ("hello world" )
2.2注释
1 2 3 4 5 6 7 """ 这个是多行注释 """ ''' 这个也是多行注释 '''
2.3变量
1 2 3 money = 10 money = money - 5 print ("余额为" , money, "元" )
2.4数据类型
1 2 3 4 string_type = type ("hello world" ) int_type = type (666 ) float_type = type (114.514 )print (string_type, int_type, float_type)
1 <class 'str' > <class 'int' > <class 'float' >
2.5数据类型转换
语句(函数)
说明
int(x)
将x转换为一个整数
float(x)
将x转换为一个浮点数
str(x)
将对象x转换为字符串
万物皆可转字符串,只有字符串是数字时才能将字符串转数字
1 2 3 4 5 6 7 8 9 10 float_str = str (114.514 )print (type (float_str), float_str) num = int ("11" )print (type (num), num) num2 = float ("1919.810" )print (type (num2), num2) fnum = float (11 )print (type (fnum), fnum) inum = int (114.514 ) print (type (inum), inum)
1 2 3 4 5 <class 'str' > 114.514 <class 'int' > 11 <class 'float' > 1919.81 <class 'float' > 11.0 <class 'int' > 114
2.6标识符
标识符命名只允许出现:
英文字母
中文(不推荐)
数字(不可以开头)
下划线_
2.7运算符
1 2 3 4 print (1 /3 )print (-17 /4 )print (-17 //4 )print (10 //4 )
1 2 3 4 0.3333333333333333-4.25 -5 2
整除取整方向默认为− ∞ -\infin − ∞
Python 中一般以新行作为语句的结束标识,可以使用 \ 将一行语句分为多行显示。如下所示:
1 2 3 4 5 6 a = 128 b = 1024 c = 512 d = a + \ b - \ c
如果包含在 []、{}、() 括号中,则不需要使用 \。如下所示:
2.8字符串的三种定义方式
1 2 3 4 5 6 7 8 9 10 name1='hello' name2="hello" name3=""" hello world """ print (name3)
单引号定义法,可以内含双引号
双引号定义法,可以内含单引号
可以用转义字符\解除引号的效用
2.9字符串拼接
1 2 3 4 s1 = "abcd" s2 = "defg" s3 = s1 + s2print (s3)
2.10字符串格式化
1 2 3 4 5 6 num = 114514 s = "abcde" message1 = "%s你好世界" % sprint (message1) message1 = "%s你好世界%s" % (s, num)print (message1)
1 2 abcde 你好世界abcde 你好世界114514
1 2 3 4 5 s = "绩点" gpa = 0.1 num = 666 message = "%s高达%f,老铁%d" % (s, gpa, num)print (message)
字符转ASCII和ASCII转字符串
1 2 print (ord ("a" ))print (chr (97 ))
字符串的大小写转化
1 2 3 4 5 6 7 8 9 str = "wHat a beaUTIFul GIrl!!" print (str .title())str = "Cpp Is The Best Programing Language" print (str .upper())str = "I HATE PYTHOn" print (str .lower())
1 2 3 What A Beautiful Girl!! CPP IS THE BEST PROGRAMING LANGUAGEi hate python
2.11数字精度控制
2.12字符串格式化的一种快速写法
格式:f”内容{变量}”
(不关心精度控制)
1 2 3 4 5 s = "绩点" gpa = 0.1 num = 666 message = f"{s} 高达{gpa} ,大佬{num} " print (message)
1 2 name = input ("你是谁?" )print ("ohhhhhhh!您就是那位著名的%s" % name)
1 2 你是谁?练习时长两年半的个人练习生 ohhhhhhh!您就是那位著名的练习时长两年半的个人练习生
input默认接受类型为string字符串
3条件语句
bool类型表示逻辑,True记作1,False记作0
python中的与或非: and or not
参考链接
1 2 3 num1 = 11 num2 = 20 print (f"11>20结果是{11 > 20 } ,类型为{type (11 > 20 )} " )
1 11 >20 结果是False ,类型为<class 'bool' >
1 2 3 4 5 6 7 num = int (input ())if num < 10 : print (f"{num} <10" )elif num <= 100 : print (f"{num} <=100" )else : print (num)
1 2 3 4 5 6 num = int (input())if num <= 100 : pass # pass 是空语句,它不做任何事情,一般用做占位语句,作用是保持程序结构的完整性。else : print (num )
4.1循环语句while
1 2 3 4 5 6 x = 1 add = 0 while x <= 100 : add += x x += 1 print (add)
4.2循环语句for
for 临时变量 in 序列类型:
字符串和range语句生成的都是序列类型
1 2 3 4 5 6 7 s = "abcdef" for ch in s: if ch == "a" : continue if (ch == "e" ): break print (ch)
range(num)
获得一个从0开始,到num结束的数字序列
range(5)取得的数据是[0,1,2,3,4]
range(num1,num2)
获得从num1开始,到num2结束的数字序列(不含num2本身)
range(5,10)取得的数据是[5,6,7,8,9]
range(num1,num2,step)
获得从num1开始,到num2结束的数字序列(不含num2本身)
数字间的步长,以step为准(默认为1)
例如,range(5,10,2)取得的数据为[5,7,9]
1 2 for x in range (5 , 11 , 2 ): print (x, end=' ' )
1 2 3 for i in range (10 , 0 , -1 ): print (i, end=' ' )print ()
reduce代替for循环
reduce
函数在python2
中是个内置函数,在python3
中被移到functools
模块中。
1 2 3 4 5 6 from functools import reducedef add (x,y ): return x+y ar=[1 ,2 ,3 ,4 ,5 ] accumulate=reduce(add,ar)print (accumulate)
解释: 1+2+3+4+5=15
作用:它用于对一个可迭代对象进行累积操作,将一个二元函数应用于序列的前两个元素,然后将结果与下一个元素继续应用该函数,直到序列中的所有元素都被处理完毕。
5函数
1 2 3 4 5 6 7 8 9 def strlen (s ): a = 0 for i in s: a += 1 return a s1 = "hello world" print (strlen(s1))
对于没有返回值的函数,返回值为None类型(也可以return None或return)
1 2 3 4 5 def nofunc (): print ("nofunc" )print (nofunc(), type (nofunc()))
1 2 3 nofunc nofuncNone <class 'NoneType' >
在if判断中None等同于False
None也可用于声明无初始内容的变量
1 2 3 4 a = None print (a, type (a)) a = 1 print (a, type (a))
1 2 None <class 'NoneType '>1 <class 'int '>
函数说明文档:
1 2 3 4 5 6 7 8 9 10 11 12 def add (x, y ): """ add函数可以接受2个参数,进行两数相加 :param x:第一个数字 :param y:第二个数字 :return:两数之和 """ result = x + y return resultprint ("1+2=" , add(1 , 2 ))
注:函数内定义的变量在函数外是完全不可访问的
函数外定义的全局变量函数内可以访问
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 num = 200 def test_a (): print (f"test_a{num} " )def test_b (): num = 500 print (f"test_b{num} " ) test_a() test_b()print (num)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 num = 200 def test_a (): print (f"test_a{num} " )def test_b (): global num num = 500 print (f"test_b{num} " ) test_a() test_b()print (num)
6.1 list数据容器-列表
定义列表
1 2 3 4 5 6 7 8 9 10 11 name_list = ["abc" , "def" , "ghi" ]print (name_list)print (type (name_list)) my_list = ["abc" , 666 , True ]print (my_list)print (type (my_list)) two_dimension = [[1 , 2 , 3 ], [4 , 5 , 6 ]]print (two_dimension)print ((type (two_dimension)))
1 2 3 4 5 6 ['abc', 'def', 'ghi'] <class 'list '> ['abc ', 666, True ] <class 'list '> [[1, 2 , 3 ], [4, 5 , 6 ]] <class 'list '>
下标索引
.index方法(由元素找到第一次出现的下标)
列表.index(元素)
Return first index of value.
Raises ValueError if the value is not present.(报错)
1 2 3 mylist = ["abc" , "def" , "ghi" ] idx=mylist.index("abc" )print (f'"abc"的下标位置为{idx} ' )
修改元素[]
1 2 3 mylist = ["abc" , "def" , "ghi" ] mylist[1 ]="bcd" print (mylist)
插入元素.insert()
1 2 3 mylist = ["abc" , "def" , "ghi" , "jkl" , "mno" ] mylist.insert(2 , "666" )print (f"在下标2处插入元素后,mylist变成{mylist} " )
1 在下标2 处插入元素后,mylist变成['abc' , 'def' , '666' , 'ghi' , 'jkl' , 'mno' ]
追加元素.append()
1 2 3 mylist = ["abc" , "def" , "ghi" , "jkl" , "mno" ] mylist.append("pqr" )print (f"在尾插元素后,mylist变成{mylist} " )
1 在尾插元素后,mylist变成['abc' , 'def' , 'ghi' , 'jkl' , 'mno' , 'pqr' ]
追加其他容器.extend()
1 2 3 mylist = ["abc" , "def" , "ghi" , "jkl" , "mno" ] mylist.extend(["pqr" , "stu" , "vwx" ])print (f"在追加列表后,mylist变成{mylist} " )
1 在追加列表后,mylist变成['abc' , 'def' , 'ghi' , 'jkl' , 'mno' , 'pqr' , 'stu' , 'vwx' ]
删除指定下标处元素
del 列表名[下标]
或列表名.pop(下标)
1 2 3 4 5 mylist = ["abc" , "def" , "ghi" , "jkl" , "mno" , "pqr" , "stu" , "vwx" ]del mylist[2 ]print (f"删除元素后,mylist变成{mylist} " ) element = mylist.pop(2 )print (f"取出{element} 后,列表变成{mylist} " )
1 2 删除元素后,mylist变成['abc' , 'def' , 'jkl' , 'mno' , 'pqr' , 'stu' , 'vwx' ] 取出jkl后,列表变成['abc' , 'def' , 'mno' , 'pqr' , 'stu' , 'vwx' ]
找到并删除元素remove
1 2 3 mylist = [1 , 2 , 3 , 2 , 3 ] mylist.remove(2 )print (mylist)
只删除从左到右的第一个
清空列表.clear()
1 2 3 mylist = [1 , 2 , 3 , 2 , 3 ] mylist.clear()print (mylist)
统计元素数量.count()
1 2 my_list = [1 , 1 , 1 , 2 , 3 ]print (my_list.count(1 ))
列表长度
1 2 my_list = [1 , 1 , 1 , 2 , 3 ]print (len (my_list))
列表长度上限为2 63 − 1 = 9223372036854775807 2^{63}-1=9223372036854775807 2 63 − 1 = 9223372036854775807
遍历容器
1 2 3 my_list = [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ]for ele in my_list: print (ele, end=" " )
1 2 3 list1 = ["这" , "是" , "一个" , "测试" ]for index, item in enumerate (list1): print (index, item)
可以设置下标从哪个数开始
1 2 3 list1 = ["这" , "是" , "一个" , "测试" ]for index, item in enumerate (list1, 1 ): print (index, item)
拷贝容器.copy
l1=l2
是深拷贝,修改l2
,l1
会跟着改变
l1-l2.copy()
是浅拷贝,修改l2
,l1
不会跟着改变
6.7 tuple数据容器-元组
和list的区别是不可修改
定义:
(元素,元素,元素,......)
空元组:变量名称=()
变量名称=tuple()
1 2 3 t = ("hello" )print (f"类型是{type (t)} ,内容是{t} " )
1 类型是<class 'str '>,内容是hello
1 2 3 4 t = ("hello" ,)print (f"类型是{type (t)} ,内容是{t} " )print (len (t))
1 2 类型是<class 'tuple '>,内容是('hello ',)1
元组不可修改,但元组中的列表可以修改
1 2 3 t = (1 , 2 , 3 , 4 , [1 , 2 , 3 , 4 ], 5 ) t[4 ][1 ] = -1 print (t)
1 (1 , 2 , 3 , 4 , [1 , -1 , 3 , 4 ], 5 )
6.8string数据容器-字符串
字符串可以通过下标进行访问
从前往后,下标从0开始递增
从后往前,下标从-1开始递减
同元组一样,字符串是一个无法修改的数据容器
index方法
1 2 s = "you are a handsome boy" print (s.index("hand" ))
.replace方法(替换)
语法:字符串.replace(字符串1,字符串2)
功能:将字符串内的全部: 字符串1,替换为字符串2
注意:不是修改字符串本身,而是得到了一个新字符串
1 2 3 4 s = "cats and dogs are good cats and dogs and cats and dogs do things cats and dogs like do" s1 = s.replace("cat" , "tiger" )print (f"s={s} " )print (f"s1={s1} " )
1 2 s=cats and dogs are good cats and dogs and cats and dogs do things cats and dogs like dos1 =tigers and dogs are good tigers and dogs and tigers and dogs do things tigers and dogs like do
.split方法(分割)
语法:字符串.split(分隔符字符串)
功能:按照指定的分隔符字符串,将字符串划分成多个字符串,并存入列表对象中
注意:字符串本身不变,而是得到了一个列表对象
1 2 3 4 s = "cats and dogs are good cats and dogs and cats and dogs do things cats and dogs like do" l = s.split(" " )print (f"s={s} " )print (f"s1={l} ,type(l)={type (l)} " )
1 2 s=cats and dogs are good cats and dogs and cats and dogs do things cats and dogs like do s1=['cats' , 'and' , 'dogs' , 'are' , 'good' , 'cats' , 'and' , 'dogs' , 'and' , 'cats' , 'and' , 'dogs' , 'do' , 'things' , 'cats' , 'and' , 'dogs' , 'like' , 'do' ],type (l)=<class 'list' >
.strip方法(规整字符串)
1 2 s = "12abcde1" print (s.strip("12" ))
.count方法统计字符串中某字符串出现的次数
1 2 s = "114514514114514514114114" print (s.count("114" ))
len统计字符串长度
1 2 s = "114514514114514514114114" print (len (s))
汇总
Python 中常用处理字符串的相关函数
原文链接
string.capitalize()
把字符串的第一个字符大写
string.count(str, beg=0, end=len(string))
返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数
string.endswith(obj, beg=0, end=len(string))
检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False.
string.find(str, beg=0, end=len(string))
检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1
string.index(str, beg=0, end=len(string))
跟find()方法一样,只不过如果str不在 string中会报一个异常.
string.isalnum()
如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False
string.isalpha()
如果 string 至少有一个字符并且所有字符都是字母则返回 True,否则返回 False
string.isdecimal()
如果 string 只包含十进制数字则返回 True 否则返回 False.
string.isdigit()
如果 string 只包含数字则返回 True 否则返回 False.
string.islower()
如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False
string.isnumeric()
如果 string 中只包含数字字符,则返回 True,否则返回 False
string.isspace()
如果 string 中只包含空格,则返回 True,否则返回 False.
string.istitle()
如果 string 是标题化的(见 title())则返回 True,否则返回 False
string.isupper()
如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False
string.join(seq)
以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
string.lower()
转换 string 中所有大写字符为小写.
string.lstrip()
截掉 string 左边的空格
max(str)
返回字符串 str 中最大的字母。
min(str)
返回字符串 str 中最小的字母。
string.replace(str1, str2, num=string.count(str1))
把 string 中的 str1 替换成 str2,如果 num 指定,则替换不超过 num 次.
string.split(str="", num=string.count(str))
以 str 为分隔符切片 string,如果 num 有指定值,则仅分隔 num+ 个子字符串
string.startswith(obj, beg=0,end=len(string))
检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查.
string.strip([obj])
在 string 上执行 lstrip()和 rstrip()
string.swapcase()
翻转 string 中的大小写
string.title()
返回"标题化"的 string,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())
string.translate(str, del="")
根据 str 给出的表(包含 256 个字符)转换 string 的字符,要过滤掉的字符放到 del 参数中
string.upper()
转换 string 中的小写字母为大写
6.10(取子序列)序列的切片
序列:内容连续,有序,可使用下标索引的一类数据容器
列表、元组、字符串均可以视为序列
注意:此操作不会影响序列本身,而是会得到一个新的序列
1 2 3 4 5 mylist = [0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] result1 = mylist[1 :4 ] result2 = mylist[2 :9 :2 ]print (result1)print (result2)
1 2 3 4 5 mytuple = (0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ) r1 = mytuple[:] r2 = mytuple[::-1 ]print (f"r1={r1} " )print (f"r2={r2} " )
1 2 r1 =(0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 )r2 =(10 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 )
6.12set集合
1 2 3 4 5 a = {1 , 2 , 3 , 4 , 5 , 6 , 1 , 1 , 1 , 1 , 1 , 1 , 11 } b = {} c = set ()print (a, b, c)print (type (b))
1 2 {1 , 2 , 3 , 4 , 5 , 6 , 11 } {} set () <class 'dict' >
因为集合是无序的,所以不支持下标索引访问
但是集合和列表一样,是允许修改的
.add添加元素
1 2 3 4 a = {11 , 2 , 3 , 4 , 5 , 6 , 7 } a.add(1 ) a.add(5 )print (a)
1 {1, 2, 3, 4, 5, 6, 7, 11}
.remove移除元素
1 2 3 a = {11 , 2 , 3 , 4 , 5 , 6 , 7 } a.remove(3 )print (a)
.pop取出元素
1 2 3 4 5 6 a = {11 , 2 , 3 , 4 , 5 , 6 , 7 }while len (a) > 0 : print (a.pop()) a = {"ab" , "idq" , "sq" , "kq" , "yc" , "mw" }while len (a) > 0 : print (a.pop())
1 2 3 4 5 6 7 8 9 10 11 12 13 2 3 4 5 6 7 11 sq yc kq mw idq ab
取出的过程对于字符串是随机的,即每次运行结果都不同
.difference集合差集
.difference_update集合的差集并更新左集合
.union集合合并
集合长度
1 2 a = {1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 }print (len (a))
集合遍历
集合不支持下标索引,所以不能用while循环遍历集合
1 2 3 set1 = {1 , 2 , 3 , 4 , 5 }for ele in set1: print (ele, end=" " )
总结
6.14 dict字典
1 2 3 4 5 6 d1 = {"a" : 97 , "b" : 98 , "c" : 99 , "d" : 100 }print (f"d1={d1} with type{type (d1)} " ) d2 = {}print (f"d2={d2} with type{type (d2)} " ) d3 = dict ()print (f"d3={d3} with type{type (d3)} " )
1 2 3 d1={'a' : 97 , 'b' : 98 , 'c' : 99 , 'd' : 100 } with type <class 'dict' > d2={} with type <class 'dict' > d3={} with type <class 'dict' >
字典不允许键值重复
key和value可以是任意数据类型,但key不能为字典(必须可哈希)
[]访问元素
不可以使用下标索引,但可以根据key找到value
1 2 d1 = {"a" : 97 , "b" : 98 , "c" : 99 , "d" : 100 }print (d1["b" ])
[]新增元素,更新元素
dict不支持访问不存在的元素(以下是错误代码)
1 2 d1 = {"a" : 97 , "b" : 98 , "c" : 99 , "d" : 100 , "e" : 101 , "f" : 102 }print (f'd1["g"]={d1["g" ]} ' )
.pop删除元素
1 2 3 d1 = {"a" : 97 , "b" : 98 , "c" : 99 , "d" : 100 , "e" : 101 , "f" : 102 } d1.pop("d" )print (d1)
1 {'a': 97 , 'b': 98 , 'c': 99 , 'e': 101 , 'f': 102 }
.clear清空元素
1 2 3 d1 = {"a" : 97 , "b" : 98 , "c" : 99 , "d" : 100 , "e" : 101 , "f" : 102 } d1.clear()print (d1)
.keys获取全部的key
1 2 3 4 d1 = {"a" : 97 , "b" : 98 , "c" : 99 , "d" : 100 , "e" : 101 , "f" : 102 } k = d1.keys()print (k)print (type (k))
1 2 dict_keys (['a' , 'b' , 'c' , 'd' , 'e' , 'f' ]) <class 'dict_keys' >
遍历容器
方式1:通过key
1 2 3 4 d1 = {"a" : 97 , "b" : 98 , "c" : 99 , "d" : 100 , "e" : 101 , "f" : 102 } k = d1.keys()for k1 in k: print (f"key={k1} ,value={d1[k1]} " , end=" " )
1 key =a,value=97 key =b,value=98 key =c,value=99 key =d,value=100 key =e,value=101 key =f,value=102
方式2:直接for循环
1 2 3 d1 = {"a" : 97 , "b" : 98 , "c" : 99 , "d" : 100 , "e" : 101 , "f" : 102 }for k1 in d1: print (f"key={k1} ,value={d1[k1]} " , end=" " )
1 key =a,value=97 key =b,value=98 key =c,value=99 key =d,value=100 key =e,value=101 key =f,value=102
len统计元素数量
1 2 d1 = {"a" : 97 , "b" : 98 , "c" : 99 , "d" : 100 , "e" : 101 , "f" : 102 }print (len (d1))
判断元素是否在容器内
1 2 3 4 5 6 7 8 9 d1 = {"a" : 97 , "b" : 98 , "c" : 99 , "d" : 100 , "e" : 101 , "f" : 102 }if "c" in d1: print ("in" )if "p" not in d1: print ("not in" )if 97 in d1.values(): print ("in" )else : print ("not in" )
总结
五类容器的总结
万物皆可转列表(list)list{container}
1 2 3 4 5 6 7 8 a1 = (1 , 2 , 3 , 4 , 5 ) b1 = "abcdefg" c1 = {1 , 2 , 3 , 4 , 5 } d1 = {"a" : 97 , "b" : 98 , "c" : 99 , "d" : 100 , "e" : 101 , "f" : 102 }print (list (a1))print (list (b1))print (list (c1))print (list (d1))
1 2 3 4 [1 , 2 , 3 , 4 , 5 ] ['a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' ] [1 , 2 , 3 , 4 , 5 ] ['a' , 'b' , 'c' , 'd' , 'e' , 'f' ]
转tuple
1 2 3 4 5 6 7 8 a1 = (1 , 2 , 3 , 4 , 5 ) b1 = "abcdefg" c1 = {1 , 2 , 3 , 4 , 5 } d1 = {"a" : 97 , "b" : 98 , "c" : 99 , "d" : 100 , "e" : 101 , "f" : 102 }print (tuple (a1))print (tuple (b1))print (tuple (c1))print (tuple (d1))
1 2 3 4 (1 , 2 , 3 , 4 , 5 ) ('a ', 'b ', 'c ', 'd ', 'e ', 'f ', 'g ') (1 , 2 , 3 , 4 , 5 ) ('a ', 'b ', 'c ', 'd ', 'e ', 'f ')
转string
1 2 3 4 5 6 7 8 a1 = (1 , 2 , 3 , 4 , 5 ) b1 = "abcdefg" c1 = {1 , 2 , 3 , 4 , 5 } d1 = {"a" : 97 , "b" : 98 , "c" : 99 , "d" : 100 , "e" : 101 , "f" : 102 }print (str (a1))print (str (b1))print (str (c1))print (str (d1))
1 2 3 4 abcdefg {1 , 2 , 3 , 4 , 5 } {'a' : 97 , 'b' : 98 , 'c' : 99 , 'd' : 100 , 'e' : 101 , 'f' : 102 }
转set
1 2 3 4 5 6 7 8 a1 = (1 , 2 , 3 , 4 , 5 ) b1 = "abcdefg" c1 = {1 , 2 , 3 , 4 , 5 } d1 = {"a" : 97 , "b" : 98 , "c" : 99 , "d" : 100 , "e" : 101 , "f" : 102 }print (set (a1))print (set (b1))print (set (c1))print (set (d1))
1 2 3 4 {1 , 2 , 3 , 4 , 5 } {'f' , 'g' , 'b' , 'c' , 'd' , 'e' , 'a' } {1 , 2 , 3 , 4 , 5 } {'f' , 'a' , 'b' , 'c' , 'd' , 'e' }
sorted通用排序功能
sorted(容器,[reverse=True])
返回一个list
1 2 3 4 5 6 7 8 a1 = (5 , 6 , 2 , 4 , 0 ) b1 = "bhwjdQNA1wq," c1 = {3 ,5 ,1 ,6 ,8 } d1 = {"d" : 97 , "c" : 98 , "q" : 99 , "r" : 100 , "l" : 101 , "x" : 102 }print (sorted (a1))print (sorted (b1))print (sorted (c1))print (sorted (d1))
1 2 3 4 [0 , 2 , 4 , 5 , 6 ] [',', '1 ', 'A ', 'N ', 'Q ', 'b ', 'd ', 'h ', 'j ', 'q ', 'w ', 'w '] [1 , 3 , 5 , 6 , 8 ] ['c ', 'd ', 'l ', 'q ', 'r ', 'x ']
1 2 3 4 5 6 7 8 a1 = (5 , 6 , 2 , 4 , 0 ) b1 = "bhwjdQNA1wq," c1 = {3 , 5 , 1 , 6 , 8 } d1 = {"d" : 97 , "c" : 98 , "q" : 99 , "r" : 100 , "l" : 101 , "x" : 102 }print (sorted (a1, reverse=True ))print (sorted (b1, reverse=True ))print (sorted (c1, reverse=True ))print (sorted (d1, reverse=True ))
1 2 3 4 [6 , 5 , 4 , 2 , 0 ] ['w ', 'w ', 'q ', 'j ', 'h ', 'd ', 'b ', 'Q ', 'N ', 'A ', '1 ', ','] [8 , 6 , 5 , 3 , 1 ] ['x ', 'r ', 'q ', 'l ', 'd ', 'c ']
sorted可指定排序的依据,参考https://blog.csdn.net/u010758410/article/details/79737498
1 2 listC = [('e' , 4 ), ('o' , 2 ), ('!' , 5 ), ('v' , 3 ), ('l' , 1 )]print (sorted (listC, key=lambda x: ((x[1 ]-3 )**2 , -ord (x[0 ]))))
排序结果为
1 [('v' , 3 ), ('o' , 2 ), ('e' , 4 ), ('l' , 1 ), ('!' , 5 )]
排序一个数组,在排序的过程中另一个等长的数组的元素顺序也跟着改变:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 array1 = [3 , 1 , 4 , 1 , 5 ] array2 = ['three' , 'one' , 'four' , 'one' , 'five' ] sorted_pairs = sorted (zip (array1, array2)) sorted_array1, sorted_array2 = zip (*sorted_pairs) sorted_array1 = list (sorted_array1) sorted_array2 = list (sorted_array2)print ("Sorted array1:" , sorted_array1)print ("Sorted array2:" , sorted_array2)
排序结果为
1 2 Sorted array1 : [1, 1, 3, 4, 5] Sorted array2 : ['one' , 'one' , 'three' , 'four' , 'five' ]
7.1函数多返回值
1 2 3 4 5 6 def test01 (): return 11 , 22 x, y = test01()print (f"x={x} ,y={y} " )
1 2 3 4 5 6 def test01 (): return 11 , 4.5 , "14" x, y, z = test01()print (f"x={x} ,y={y} ,z={z} " )
7.2 函数的多种参数使用形式
位置参数
1 2 3 4 5 def test01 (name, age, gender ): print (name, age, gender) test01('Tom' , 10 , '沃尔玛塑料袋' )
关键字参数
1 2 3 4 5 def test01 (name, age, gender ): print (name, age, gender) test01(name='Tom' , age=10 , gender='武装直升机' )
1 2 3 4 5 def test01 (name, age, gender ): print (name, age, gender) test01(name='Tom' , gender='武装直升机' , age=10 )
1 2 3 4 5 6 def test01 (name, age, gender ): print (name, age, gender) test01('Tom' , gender='武装直升机' , age=10 )
缺省参数
默认参数必须放在最后
1 2 3 4 5 def test01 (name, age, gender="草履虫" ): print (name, age, gender) test01('Tom' , 10 )
不定长参数
位置传递
1 2 3 4 5 6 7 def test01 (*args ): print (args) test01('Jerry' ) test01('Tom' , 10 ) test01('Trump' , 77 , 'Walmart bag' )
1 2 3 ('Jerry ',) ('Tom ', 10 ) ('Trump ', 77 , 'Walmart bag')
关键字传递
1 2 3 4 5 def user (**kwargs ): print (kwargs) user(name='TOM' , age=18 , id =110 )
1 {'name': 'TOM', 'age': 18 , 'id': 110 }
args -> arguments
kwargs -> key word arguments
7.3函数作为参数传递
1 2 3 4 5 6 7 8 9 10 11 def test_func (compute ): result = compute(1 , 2 ) print (result) print (type (compute))def add (x, y ): return x + y test_func(add)
7.4 lambda匿名函数
lambda 传入参数: 函数体(一行代码)
1 2 3 4 5 6 7 def test_func (compute ): result = compute(1 , 2 ) print (result) print (type (compute)) test_func(lambda x, y: x + y)
8.2 文件的读取
1 2 3 4 5 6 7 file_name = "input.txt" with open (file_name, "r" ) as file: content = file.readlines() content = [s.strip() for s in content]print (content)
1 ['11111111111111 11111111111111 11111111 ', '11000000000111 11111111111110 00000001 ', '11111111111111 11111111111111 11111111 ']
8.4文件的写出
1 2 3 4 5 6 with open ("hello.txt" , "w" , encoding="UTF-8" ) as file: file.write("hello world" ) file.flush()
9.4模块的概念和导入
1 2 3 4 5 import time print (1 ) time.sleep(1 )print (2 )
导入time模块后,就可以通过time.访问其中的内容(类,函数,变量)
1 2 3 4 5 6 from time import sleep print (1 ) sleep(1 )print (2 )
1 2 3 4 5 6 from time import * print (1 ) sleep(1 )print (2 )
1 from functools import cache
给模块起别名
1 2 3 4 5 6 7 import time as tt print (1 ) tt.sleep(1 )print (2 )
给函数起别名
1 2 3 4 5 6 from time import sleep as sl print (1 ) sl(2 )print (2 )
9.5自定义模块
1 2 3 4 5 6 def print_hi (name ): print (f'Hi, {name} ' )if __name__ == '__main__' : print_hi('PyCharm' )
运行模块时会输出Hi, PyCharm
在其他文件导入模块时,不会输出Hi, PyCharm
9.6 自定义python包
什么是Python包
从物理上看,包就是一个文件夹,在该文件夹下包含了一个__init__.py
文件,该文件夹可用于包含多个模块文件
从逻辑上看,包的本质依然是模块
导入包
方式一:
导入: import 包名.模块名
使用: 包名.模块名.目标函数
方式二:
导入: from 包名 import 模块名
使用: 模块名.目标函数
方式三:
导入: from 包名.模块名 import 目标函数
使用: 目标函数
方式四:
9.7安装第三方包
什么是第三方包
我们知道,包可以包含一堆的Python模块,而每个模块又内含许多的功能。
所以,我们可以认为:一个包,就是一堆同类型功能的集合体。
在Python程序的生态中,有许多非常多的第三方包(非Python官方),可以极大的帮助我们提高开发效率,如:
这些第三方的包,极大的丰富了Python的生态,提高了开发效率。
但是由于是第三方,所以Python没有内置,所以我们需要安装它们才可以导入使用哦。
安装第三方包 -pip
第三方包的安装非常简单,我们只需要使用Python内置的pip程序即可。
打开我们许久未见的:命令提示符程序,在里面输入:
pip install 包名称
即可通过网络快速安装第三方包
pip的网络优化
由于pip是连接的国外的网站进行包的下载,所以有的时候会速度很慢。
我们可以通过如下命令,让其连接国内的网站进行包的安装:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple 包名称
二.1.1类和对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class cla : a = None b = None c = None d = None c = cla() c.a = "abc" c.b = 1 c.c = 114.514 c.d = True print (c)print (type (c))print (c.a)
1 2 3 <__m ain__ .cla object at 0 x0000025 DE9 D36 ED0 > <class '__main__.cla' > abc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 class man : name = None def sayhi (self ): print (f"我是{self.name} " ) def sayhi1 (self, msg ): print (f"我是{self.name} ,{msg} " ) he = man() he.name = "iurefbref" he.sayhi() he.sayhi1("hhhhhhh" )
1 2 我是iurefbref 我是iurefbref,hhhhhhh
(python不支持函数重载)
1 2 3 4 5 6 7 8 9 def f1 (a ): print ("a" )def f1 (a, b ): print ("b" ) f1(2 ) f1(2 , 3 )
1.4构造方法
Python类可以使用:__init__()
方法,称之为构造方法。
可以实现:
在创建类对象(构造类)的时候,会自动执行
在创建类对象(构造类)的时候,将传入参数自动传递给__init__
方法使用。
1 2 3 4 5 6 7 8 9 10 11 12 class student : name = None age = None tel = None def __init__ (self, name, age, tel ): self.name = name self.age = age self.tel = tel stu = student("张三" , 31 , "1145141919810" )
1 2 3 4 5 6 7 8 9 class student : def __init__ (self, name, age, tel ): self.name = name self.age = age self.tel = tel stu = student("张三" , 31 , "1145141919810" )
这样写也是对的
1.5魔术方法
上文学习的__init__
构造方法,是Python类内置的方法之一。
这些内置的类方法,各自有各自特殊的功能,这些内置方法我们称之为:魔术方法
__init__
构造方法
__str__
字符串方法, 控制类转换成字符串时的行为
__lt__
小于,大于符号比较
__le__
小于等于,大于等于符号比较
__eq__
==符号比较
__str__
方法(类似重载cout
)
1 2 3 4 5 6 7 8 9 10 11 12 13 class student : def __init__ (self, name, age, tel ): self.name = name self.age = age self.tel = tel def __str__ (self ): return f"Student类对象, name = {self.name} , age = {self.age} , tel = {self.tel} " stu = student("张三" , 31 , "1145141919810" )print (stu)
1 Student 类对象, name = 张三 , age = 31 , tel = 1145141919810
__lt__
方法(类似重载‘<’,’>’)
__lt__
本质上是小于符号比较的(lower than),但它也能做到大于符号比较
写该函数时,只需返回一个bool
变量,表示用小于符号时为true的条件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class student : def __init__ (self, name, age, tel ): self.name = name self.age = age self.tel = tel def __str__ (self ): return f"Student类对象, name = {self.name} , age = {self.age} , tel = {self.tel} " def __lt__ (self, other ): return self.age < other.age stu1 = student("张三" , 31 , "1145141919810" ) stu2 = student("里斯" , 29 , "1919810114514" )print (stu1 < stu2)print (stu1 > stu2)
__le__
方法(类似重载>=,<=)
less equal
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 class student : def __init__ (self, name, age, tel ): self.name = name self.age = age self.tel = tel def __str__ (self ): return f"Student类对象, name = {self.name} , age = {self.age} , tel = {self.tel} " def __le__ (self, other ): return self.age <= other.age stu1 = student("张三" , 31 , "1145141919810" ) stu2 = student("里斯" , 31 , "1919810114514" )print (stu1 <= stu2)print (stu1 >= stu2)
__eq__
方法(类似重载==,!=)
equal
代码略
需要注意,对象自带比较==和!=的方法,当然只是比较内存地址是否相等
1.6封装
私有成员
既然现实事物有不公开的属性和行为,那么作为现实事物在程序中映射的类,也应该支持。
类中提供了私有成员的形式来支持。
定义私有成员的方式非常简单,只需要:
私有成员变量:变量名以__
开头(2个下划线)
私有成员方法:方法名以__
开头(2个下划线)
即可完成私有成员的设置
1.8继承
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 class student : def __init__ (self, name, age, tel ): self.name = name self.age = age self.tel = tel def __str__ (self ): return f"Student类对象, name = {self.name} , age = {self.age} , tel = {self.tel} " def __le__ (self, other ): return self.age <= other.ageclass dalao (student ): GPA = 5.0 d1 = dalao("王五" , 30 , "114514" )print (d1.GPA)
多继承:
class 类名(父类1,父类2,...):
括号内越靠左,优先级越高(存在同名方法时)
复写
子类继承父类的成员属性和成员方法后,如果对其“不满意”,那么可以进行复写。
即:在子类中重新定义同名的属性或方法即可。
调用父类同名成员
一旦复写父类成员,那么类对象调用成员的时候,就会调用复写后的新成员
如果需要使用被复写的父类的成员,需要特殊的调用方式:
方式1:调用父类成员
使用成员变量:父类名.成员变量
使用成员方法:父类名.成员方法(self)
方式2:使用super()调用父类成员
使用成员方法: super().成员方法()
使用成员变量:super().成员变量
1.10变量的类型注解
类型注解
Python在3.5版本的时候引入了类型注解,以方便静态类型检查工具,IDE等第三方工具。
类型注解:在代码中涉及数据交互的地方,提供数据类型的注解(显式的说明)。
主要功能:帮助第三方IDE工具(如PyCharm)对代码进行类型推断,协助做代码提示
帮助开发者自身对变量进行类型注释
支持:
变量的类型注解
函数(方法)形参列表和返回值的类型注解
按住需要用的函数和alt+enter
可以自动搜索并导入包
类型注解是提示性的,而不是决定性的,以下的代码不会报错
1 2 var: int = "itheima" print (var)
对于函数:形参注释
def 函数方法名(形参名: 类型, 形参名:类型, ...)->返回值类型:
union用法:
1 2 3 from typing import Union my_list: list [Union [str , int ]] = [1 , 2 , "itheima" , "itcast" ]
1.13多态
话不多说,上代码
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 class animal : def speak (self ): pass class dog (animal ): def speak (self ): print ("汪汪汪" )class cat (animal ): def speak (self ): print ("喵喵喵" )class robot : def speak (self ): print ("滋滋滋" )def make_noise (ani: animal ): ani.speak() a = animal() b = dog() c = cat() d = robot() make_noise(a) make_noise(b) make_noise(c) make_noise(d)