python學(xué)習(xí)筆記(《Python教程全套》楊淑娟)

視頻資源來自:b站楊淑娟老師——《Python教程全套》完全入門版
文章僅為個(gè)人觀看視頻后的學(xué)習(xí)心得筆記,用于個(gè)人查看和記錄保存。文中定有疏漏錯(cuò)誤之處,懇請指正。


目錄
一、python入門
二、字符編碼
三、運(yùn)算符
四、程序的組織結(jié)構(gòu)
五、循環(huán)
六、列表
七、字典
八-1、元組
八-2、集合
九、字符串
十、函數(shù)
十一、異常處理
十二、類與對象
十三、對象
十四、模塊化
十五、文件
十六、學(xué)生信息管理系統(tǒng)
十七、實(shí)操案例

一、python入門

python簡介

解釋型語言,沒有編譯環(huán)節(jié)
交互型語言
面向?qū)ο?/p>

下載安裝python、pycharm

配置解釋器

image-20210724181850483

python中的輸出函數(shù)

print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)

print函數(shù)默認(rèn)換行,是end='\n'在起作用。

print(i,end='\t') 

不換行,輸出完之后,結(jié)尾用制表符代替

print可以輸出數(shù)字、字符串(加引號(hào))、含有運(yùn)算符的表達(dá)式
輸出到文件

fp=open('D:/text.txt','a+')
print('hello world',file=fp)
fp.close()

'a+'如果文件不存在就直接創(chuàng)建,存在就在文件內(nèi)容的后面繼續(xù)追加
1.指定的盤符存在,
2.使用file= fp

不進(jìn)行換行輸出(輸出內(nèi)容在一行當(dāng)中)

print('hello','world','Python')
image

轉(zhuǎn)義字符

\ \ 用兩個(gè)反斜杠來表示一個(gè)反斜杠
\n -> newline換行

\t,每次占一個(gè)制表位,一個(gè)制表位占4格()

print('a\tbcdefghi')
print('ab\tcdefghi')
print('abc\tdefghi')
print('abcd\tefghi')
image

\r 覆蓋

print('hello\rworld')
image

\b 退格

print('hello\bworld')
image

單雙引號(hào)混用

原字符,不希望字符串中的轉(zhuǎn)義字符起作用,就使用原字符,就是在字符串之前加上r,或R。==注意==:最后一個(gè)字符不能是\。想寫\可以用\\代替。因?yàn)樽址膬?yōu)先級(jí)不同

print(r'hello\bworld')
image

二、字符編碼

二進(jìn)制與字符編碼

ASCII

graph TD
A(二進(jìn)制0\,1) -->B(ASCII)
B --> C(GB2312)
B --> D(其他國家的字符編碼)
C --> E(GBK)
D --> F(Unicode幾乎包含了全世界的字符)
E --> G(GB18030)
F --> H(UTF-8)
G --> F
print(chr(0b100111001011000))
print(chr(20056))
print(ord('乘'))
image

Python中的標(biāo)識(shí)符與保留字

import keyword
print(keyword.kwlist)

['False', 'None', 'True', '_peg_parser_', 'and', 'as', 'assert', 'async', 'await', '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']

標(biāo)識(shí)符嚴(yán)格區(qū)分大小寫

Python中的變量與數(shù)據(jù)類型

標(biāo)識(shí):標(biāo)識(shí)對象所存儲(chǔ)的內(nèi)存地址,使用內(nèi)置函數(shù)id(obj)來獲取

類型:標(biāo)識(shí)的是對象的數(shù)據(jù)類型,使用內(nèi)置函數(shù)type(obj)來獲取

name = '瑪麗亞'
print('值',name)
print('標(biāo)識(shí)',id(name))
print('類型',type(name))
image

多次賦值后,變量名會(huì)指向新的空間

image-20210724203417958

數(shù)據(jù)類型:int float bool str

整數(shù)可以表示為二進(jìn)制0b、八進(jìn)制0o、十進(jìn)制、十六進(jìn)制0x。

浮點(diǎn)數(shù),計(jì)算可能不精確。
解決方法:導(dǎo)入模塊

print(1.1+2.2)

from decimal import Decimal
print(Decimal('1.1')+Decimal('2.2'))
image

布爾類型,可以轉(zhuǎn)成證數(shù)進(jìn)行計(jì)算。TrueFalse首字母都必須大寫

f1=True
f2=False
print(f1+1) #2
print(f2+1) #1

字符串類型,三引號(hào)(3個(gè)單引號(hào)/3個(gè)雙引號(hào))定義的字符串可以分布在連續(xù)的多行。

str1='''好好學(xué)習(xí),
天天向上'''
str2="""好好學(xué)習(xí),
        天天向上"""
print(str1)
print(str2)
image-20210724205325888

甚至空格也給你記進(jìn)去

數(shù)據(jù)類型轉(zhuǎn)換:
str():當(dāng)str和int型連接時(shí),用+會(huì)報(bào)錯(cuò),可以用, 也可以用str()
int():str->int,字符串必須為整數(shù)數(shù)字串。float->int,截取整數(shù)部分。bool->int,1或0。
float():str->float,字符串必須為數(shù)字串。int->float,98->98.0

Python中的注釋

單行注釋:#
多行注釋:'''一對三引號(hào)之間的為多行注釋'''

中文編碼聲明注釋:python默認(rèn)存儲(chǔ)為UTF-8,在文件開頭注釋

#coding:gbk

該文件就默認(rèn)存儲(chǔ)為GBK了

三、運(yùn)算符

Python的輸入函數(shù)input()

present = input('好好學(xué)習(xí)')
print(present,type(present))
image

想要輸入整數(shù)類型時(shí),別忘了類型轉(zhuǎn)換int()

a=int(input('輸入整數(shù)'))

Python中的運(yùn)算符

算數(shù)運(yùn)算符

標(biāo)準(zhǔn)算數(shù)運(yùn)算符:加、減、乘、除(/)、整除(//,一正一負(fù)向下取整,9//-4=-3)
取余運(yùn)算符:%,余數(shù)=被除數(shù)-除數(shù)*商。9%-4=-3,-9%4=3。
冪運(yùn)算符:**
2**3=8

賦值運(yùn)算符

支持鏈?zhǔn)劫x值:a=b=c=20

支持參數(shù)賦值:+=、-=、/=、//=、%=

支持系列解包賦值:a,b,c=20,30,40
左右變量數(shù)和值的個(gè)數(shù)要相同。
交換a,b=b,a

比較運(yùn)算符

結(jié)果為bool型。
== 比較運(yùn)算符,比較值
is ,is not,比較標(biāo)識(shí)

a=10
b=10
print(a==b)
print(a is b)
image

先創(chuàng)建a,在創(chuàng)建b的時(shí)候,發(fā)現(xiàn)已經(jīng)有了10,就直接也指向那個(gè)對象了。所以 a、b標(biāo)識(shí)一樣。

但是數(shù)組的id地址不相同

布爾運(yùn)算符

and 相當(dāng)于&&

or 相當(dāng)于||

not 相當(dāng)于!

in ,not in :

a='hello world'
print('w' in a)
print('s' in a)
print('w'not in a)
image

位運(yùn)算符

按位與& 、按位或| 、左移<< 、右移>>

運(yùn)算符的優(yōu)先級(jí)

算數(shù)運(yùn)算->位運(yùn)算->比較運(yùn)算->布爾運(yùn)算->賦值運(yùn)算

四、程序的組織結(jié)構(gòu)

順序結(jié)構(gòu)、選擇結(jié)構(gòu)、循環(huán)結(jié)構(gòu)

對象的布爾值

python一切皆對象,所有對象都有一個(gè)布爾值

False:False、數(shù)值0、None、空字符串、空列表([]、list())、空元組(()、tuple())、空字典({}、dict())、空集合(set())

其它對象的布爾值均為True

分支結(jié)構(gòu)

單分支結(jié)構(gòu)

雙分支結(jié)構(gòu)

多分支結(jié)構(gòu)

money = int(input())
if 90<=money<=100:
    print('優(yōu)')
elif 80<=money<90:
    print('良')
else:
    print('及')

嵌套if

print('優(yōu)' if 90<=money<=100 else ('良',money) )

pass語句

什么都不做,只是一個(gè)占位符,用在語法上需要語句的地方

if 80<=money<90:
    pass
else:
    print('及')

沒想好咋寫,這樣語法也不會(huì)報(bào)錯(cuò)

五、循環(huán)

內(nèi)置函數(shù)range()

內(nèi)置函數(shù):前面不需要加任何函數(shù),可以直接使用。

range(),用于生成一個(gè)整數(shù)序列。默認(rèn)從0開始,步長1

range(stop),創(chuàng)建一個(gè)[0,stop)之間的整數(shù)序列,步長為1
range(start,stop),
range(start,stop,step),創(chuàng)建一個(gè)[start,stop)之間的整數(shù)序列,步長為step

優(yōu)點(diǎn):占用內(nèi)存空間固定,值存儲(chǔ)3個(gè)值

while循環(huán)

a=2
sum=0
while a<=100:
    sum+=a
    a+=2
print('1-100之間的偶數(shù)和',sum)

for-in循環(huán)

in表達(dá)從(字符串、序列等)中依次取值(遍歷)
for-in編歷的對象必須是可迭代對象

如果不需要使用自定義變量,可將自定義變量改用下劃線_表示

for item in 'Python':
    print(item)
for i in range(10):
    print(i)
for _ in range(5):
    print('重復(fù)輸出5次')

100-999之間的水仙花數(shù)

for item in range(100,1000):
    a=item//100
    b=(item-a*100)//10
    c=item%10
    if a**3+b**3+c**3==item:
        print(item)

break、continue與else語句

輸出1-50之間所有5的倍數(shù)

for item in range(1,51):
    if item%5!=0:
        continue
    print(item)

else與 while、for搭配使用時(shí),沒有碰到break時(shí)執(zhí)行else。循環(huán)的正常執(zhí)行次數(shù)執(zhí)行完,就執(zhí)行else

for i in range(4):
    for j in range(3):
        print('*',end='\t')
    print()# 加了這個(gè)就會(huì)換行啦

二重循環(huán)中的break和continue用于控制本層循環(huán)

嵌套循環(huán)

六、列表

列表元素按順序有序排序
所以映射唯一一個(gè)數(shù)據(jù)
列表可以存儲(chǔ)重復(fù)數(shù)據(jù)
任意數(shù)據(jù)類型混存
根據(jù)需要?jiǎng)討B(tài)分配和回收內(nèi)存

列表的創(chuàng)建與刪除

使用中括號(hào)

lst1=['hello','world',98]

使用內(nèi)置函數(shù)list()

lst2=list(['hello','world',98])

lst1、lst2,存儲(chǔ) 列表對象的引用

列表生成式

lst=[i*i for i in range(1,10)]#[1, 4, 9, 16, 25, 36, 49, 64, 81]

列表的查詢操作

獲取列表中指定元素的索引index()
如果列表中存在N個(gè)相同元素,只返回相同元素中的第一個(gè)元素的索引
如果查詢的元素在列表中不存在,則會(huì)拋出ValueError
還可以在指定start和stop直接進(jìn)行查找

lst1=['hello','world',98,100]
print(lst1.index('world'))
print(lst1.index('world',1,3))

獲取列表中的單個(gè)元素
正向索引從0到N-1
逆向元素從-N到-1
指定索引不存,拋出indexError

lst1 = ['hello', 'world', 98, 100]
print(lst1[2])#98
print(lst1[-4],lst1[-3],lst1[-2],lst1[-1])#hello world 98 100

獲取列表中的多個(gè)元素(切片操作):
切片結(jié)果是元列表片段的拷貝
切片的范圍[start,stop),默認(rèn)為[0,N)
步長默認(rèn)為1

step為正數(shù):從start開始往后計(jì)算切片

lst = [0,1,2,3,4,5,6,7,8,9]
print(lst[2:6:2])#[2, 4]
print(lst[2:6])#[2, 3, 4, 5]
print(lst[2:6:])#[2, 3, 4, 5]
print(lst[:6:])#[0, 1, 2, 3, 4, 5]
print(lst[::])#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

step為負(fù)數(shù):從start開始往前計(jì)算切片

lst = [0,1,2,3,4,5,6,7,8,9]
print(lst[6:2:-2])#[6, 4]
print(lst[2::-1])#[2, 1, 0]
print(lst[:6:-1])#[9, 8, 7]
print(lst[::-1])#[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

可以用in、not in來判斷指定元素在列表中是否存在

可以用for 迭代變量 in 列表名來遍歷列表

列表元素的增、刪、改操作

增加:內(nèi)存沒有更改,就是在元列表中添加

方法 描述
append() 在列表的末尾添加一個(gè)元素
extend() 在列表的末尾至少添加一個(gè)元素
insert() 在列表的任意位置添加一個(gè)元素
切片 在列表的任意位置至少添加一個(gè)元素

以下代碼分別執(zhí)行

lst = [0,1,2,3,4,5,6,7]
lst.append(80)#[0, 1, 2, 3, 4, 5, 6, 7, 80]

lst2 = ['a','b','c']
lst.append(lst2)#[0, 1, 2, 3, 4, 5, 6, 7, ['a', 'b', 'c']]
lst.extend(lst2)#[0, 1, 2, 3, 4, 5, 6, 7, 'a', 'b', 'c']
lst.insert(2,90)#[0, 1, 90, 2, 3, 4, 5, 6, 7]
lst.insert(2,lst2)#[0, 1, ['a', 'b', 'c'], 2, 3, 4, 5, 6, 7]
lst[3::]=lst2#[0, 1, 2, 'a', 'b', 'c']
lst[:4:]=lst2#['a', 'b', 'c', 4, 5, 6, 7]
lst[::3]=lst2#['a', 1, 2, 'b', 4, 5, 'c', 7]

刪除

方法 描述
remove() 一次刪除一個(gè)元素;重復(fù)元素只刪除第一個(gè);元素不存在就拋出ValueError
pop() 刪除一個(gè)指定索引位置上的元素;不指定索引,則刪除列表中最后一個(gè)元素;指定索引不存在就拋出ValueError
切片 一次至少刪除一個(gè)元素
clear() 清空列表
del 刪除列表對象

remove寫的是元素值,pop寫的是索引

切片↓

lst = [0,1,2,3,4,5,6,7]
new_list = lst[1:3]#產(chǎn)生新對象[1, 2]
lst[1:3]=[]#在原列表中刪除[0, 3, 4, 5, 6, 7]

修改
以下代碼分開執(zhí)行

lst = [0,1,2,3,4,5]
lst[2]='a'  #[0, 1, 'a', 3, 4, 5]
lst[1:3]=['a','b','c','d']#[0, 'a', 'b', 'c', 'd', 3, 4, 5]

列表元素的排序

sort():不指定reverse,就默認(rèn)False,升序排序

lst=[20,40,30,10,50]
lst.sort()#[10, 20, 30, 40, 50]
lst.sort(reverse=True)#[50, 40, 30, 20, 10]
new_list = sorted(lst)
new_list = sorted(lst,reverse=True)

使用內(nèi)置函數(shù)sorted(),原列表不發(fā)生變化

七、字典

什么是字典

python內(nèi)置的數(shù)據(jù)結(jié)構(gòu)之一,與列表一樣是一個(gè)可變序列
以鍵值對的方式存儲(chǔ)數(shù)據(jù),字典是一個(gè)無序的序列

image-20210725214331726

鍵必須是一個(gè)不可變序列(不可以執(zhí)行增刪改操作),如整數(shù)序列、字符串序列

特點(diǎn):
所有元素都是一個(gè)key-value對,key不允許重復(fù),value可以重復(fù)
字典中的元素是無序的
字典中的key必須是不可變對象
字典也可以根據(jù)需要?jiǎng)討B(tài)地伸縮
字典會(huì)浪費(fèi)較大的內(nèi)存,是一種使用空間換時(shí)間的數(shù)據(jù)結(jié)構(gòu)

字典的實(shí)現(xiàn)原理

hash

字典的創(chuàng)建與刪除

#{'張三': 100, '李四': 90, '王五': 80}
scores1 = {'張三':100, '李四':90, '王五':80}
scores2 = dict(張三 = 100, 李四 = 90, 王五 = 80)
scores3 = {}#創(chuàng)建空字典

字典的常用操作

查詢

print(scores1['張三'])
print(scores1.get('張三'))
print(scores1.get('鄧布利多',99))#如果查找不存在,返回默認(rèn)值99

如果找不到,[]會(huì)報(bào)KeyError。get會(huì)報(bào)None

key的判斷:in、not in

print('張三' in scores1)

scores1['趙六']=70

del scores1['張三']
scores1.clear()

沒有就新增,有就修改

scores1['趙六']=70

獲取視圖

keys=scores1.keys()
print(keys,type(keys))
print(list(keys))#將所有鍵組成的視圖轉(zhuǎn)成列表

values=scores1.values()
print(values,type(values))
print(list(values))

items=scores1.items()
print(items,type(items))
print(list(items))#轉(zhuǎn)換之后的列表元素是由元組組成的

dict_keys(['張三', '李四', '王五']) <class 'dict_keys'>
['張三', '李四', '王五']

dict_values([100, 90, 80]) <class 'dict_values'>
[100, 90, 80]

dict_items([('張三', 100), ('李四', 90), ('王五', 80)]) <class 'dict_items'>
[('張三', 100), ('李四', 90), ('王五', 80)]

字典元素的編歷

for item in scores1:
    print(item,scores1[item],scores1.get(item))

結(jié)果:
張三 100 100
李四 90 90
王五 80 80

字典生成式

內(nèi)置函數(shù)zip()
用于將可迭代的對象作為參數(shù),將對象中對應(yīng)的元素打包成一個(gè)元組,然后返回由這些元組組成的列表

items = ['Fruits','Books','Others']
prices = [10,20,30,40,50]

d={item:price for item,price in zip(items,prices)}
#{'Fruits': 10, 'Books': 20, 'Others': 30}

壓縮打包的時(shí)候會(huì)以元素少的那個(gè)列表為基準(zhǔn)

八-1、元組

什么是元組

Python內(nèi)置的數(shù)據(jù)結(jié)構(gòu)之一,是一個(gè)<u>不可變序列</u>。==沒有元組生成式==

不可變序列:字符串、元組。沒有增刪改的操作
可變序列:列表、字典??梢詫π蛄袌?zhí)行增、刪、改操作,對象地址不發(fā)生改變

列表用[],元組用()

為什么要將元組設(shè)計(jì)成不可變序列?
設(shè)計(jì)成不可變序列后,在多任務(wù)環(huán)境下,同時(shí)操作對象時(shí)不需要加鎖。(可以看數(shù)據(jù)、取數(shù)據(jù),但是不能增刪改)因此,在程序中盡量使用不可變序列
注意:元組中存儲(chǔ)的對象:
如果元組中的對象本身是不可變對象,則不能再引用其他對象
如果元組中的對象是可變對象,則可變對象的引用不允許改變,但數(shù)據(jù)可以改變

可以向列表中添加元素,而列表的內(nèi)容的地址不變

元組的創(chuàng)建方式

()、內(nèi)置函數(shù)tuple()

t1=('hello','world',80)
tw='hello','world',80       #元素有2+個(gè)時(shí),小括號(hào)可以省略

t3=tuple(('hello','world',80))

t4=('hello',)

t5=()
t6=tuple()

只包含一個(gè)元組的元素需要使用逗號(hào)和小括號(hào)

元組的編歷

1、使用索引
2、元組是可迭代對象,所以可以使用for…in進(jìn)行編歷

八-2、集合

什么是集合

集合是沒有value的字典(字典中鍵不能重復(fù),同樣 集合中的元素也不能重復(fù))

集合的創(chuàng)建

集合中的元素是無序的,不重復(fù)

s1={2,3,4,4,5,6,2,1}#{1, 2, 3, 4, 5, 6}
print(s1)

s=set([3,4,5,10])#列表{10, 3, 4, 5}
s=set((3,4,5,10))#元組{10, 3, 4, 5}
s=set('Hello')#字符串{'o', 'H', 'l', 'e'}
s=set({3,4,5,10})#集合{10, 3, 4, 5}
s=set()#set()

定義空集合時(shí)用set,如果直接用{},會(huì)被當(dāng)作為字典類型

集合的增、刪、改、查操作

判斷:in、not in

新增:
add():一次添加一個(gè)元素
update():一次至少添加一個(gè)元素(里面可以填集合、列表、元組)

刪除:
remove():一次刪除一個(gè)指定元素,如果指定的元素不存在就拋出KeyError
discard():一次刪除一個(gè)指定元素,如果指定元素不存在 不拋異常
pop():一次只刪除一個(gè)任意元素
clear():清空集合

集合間的關(guān)系

是否相等==或!=
一個(gè)集合是否是另一個(gè)集合的子集issubset
一個(gè)集合是否是另一個(gè)集合的超集issuperset
兩個(gè)集合是否沒有交集isdisjoint

集合的數(shù)學(xué)操作

s1={2,3,4,6}
s2={3,4,5,6}

#交集{3, 4, 6}
print(s1.intersection(s2))
print(s1 & s2)

#并集{2, 3, 4, 5, 6}
print(s1.union(s2))
print(s1 | s2)

#差集{2}
print(s1.difference(s2))
print(s1-s2)

#對稱差集{2, 5}
print(s1.symmetric_difference(s2))
print(s1^s2)

集合生成式

就是把列表生成式的[]改成{}

s1={i*i for i in range(10)}

九、字符串

字符串的駐留機(jī)制

字符串是基本數(shù)據(jù)類型,是一個(gè)不可變的字符序列

Python的駐留機(jī)制對相同的字符串只保留一份拷貝,后續(xù)創(chuàng)建相統(tǒng)字符串時(shí),不會(huì)開辟新空間,而是把該字符串的地址賦給新創(chuàng)建的變量

交互模式(cmd)幾種情況:
字符串長度為0或1時(shí)
符合標(biāo)識(shí)符的字符串:不符合標(biāo)識(shí)符的就不能駐留,比如'abc%'
字符串只在編譯時(shí)進(jìn)行駐留,而非運(yùn)行時(shí):用join連接的和原字符串不能共用
[-5,256]之間的整數(shù)數(shù)字:駐留

在需要拼接字符串時(shí),建議使用join方法,而不是+。
因?yàn)閖oin()方法是先計(jì)算出所有字符的長度,然后再拷貝,只new一次對象,效率更高

字符串的常用操作

查詢

方法 作用
index() 查找子串第一次出現(xiàn)的位置,如果查找的子串不存在,則拋出ValueError
rindex() 查找子串最后一次出現(xiàn)的位置,如果查找的子串不存在,則拋出ValueError
find() 查找子串第一次出現(xiàn)的位置,如果查找的子串不存在,則返回-1
rfind() 查找子串最后一次出現(xiàn)的位置,如果查找的子串不存在,則返回-1

大小寫轉(zhuǎn)換

轉(zhuǎn)換之后,會(huì)產(chǎn)生一個(gè)新的字符串對象

方法 作用
upper() 把字符串中所有字符都轉(zhuǎn)成大寫字母
lower() 把字符串中所有字符都轉(zhuǎn)成小寫字母
swapcase() 把字符串中所有小寫字符都轉(zhuǎn)成大寫字母,所有大寫字符都轉(zhuǎn)成小寫字母
capitalize() 把第一個(gè)字符轉(zhuǎn)換為大寫,把其余字符轉(zhuǎn)換成小寫
title() 把每個(gè)單詞的第一個(gè)字符轉(zhuǎn)換為大寫,把每個(gè)單詞的剩余字符轉(zhuǎn)換為小寫

字符串內(nèi)容對齊操作的方法

方法 作用
center() 居中對齊,第1個(gè)參數(shù)指定寬度,第2個(gè)參數(shù)指定填充符。第2個(gè)參數(shù)是可選的,默認(rèn)是空格。如果設(shè)置寬度小于實(shí)際寬度,則返回原字符串
ljust() 左對齊,第1個(gè)參數(shù)指定寬度,第2個(gè)參數(shù)指定填充符。第2個(gè)參數(shù)是可選的,默認(rèn)是空格。如果設(shè)置寬度小于實(shí)際寬度,則返回原字符串
rjust() 右對齊,第1個(gè)參數(shù)指定寬度,第2個(gè)參數(shù)指定填充符。第2個(gè)參數(shù)是可選的,默認(rèn)是空格。如果設(shè)置寬度小于實(shí)際寬度,則返回原字符串
zfill() 右對齊,左邊用0填充。該方法只接收1個(gè)參數(shù),用于指定字符串的寬度。如果設(shè)置寬度小于實(shí)際寬度,則返回原字符串
strip() 移除字符串頭尾指定的字符(默認(rèn)為空格或換行符)或字符序列

注意:zfill()中如果有負(fù)號(hào)在開頭,那么零填充在符號(hào)后。

print('-aads'.zfill(8))#-000aads

字符串劈分操作的方法

方法 作用
split() 從字符串的左邊開始劈分,默認(rèn)的劈分字符是空格字符串,返回的值都是一個(gè)列表;以通過參數(shù)sep指定劈分字符串是的劈分符;通過參數(shù)maxsplit指定劈分字符串時(shí)的最大劈分次數(shù),在經(jīng)過最大次劈分之后,剩余的子串會(huì)單獨(dú)作為一部分
rsplit() 從字符串的右邊開始劈分,默認(rèn)的劈分字符是空格字符串,返回的值都是一個(gè)列表;以通過參數(shù)sep指定劈分字符串是的劈分符;通過參數(shù)maxsplit指定劈分字符串時(shí)的最大劈分次數(shù),在經(jīng)過最大次劈分之后,剩余的子串會(huì)單獨(dú)作為一部分
s='hello world python'
lst=s.split()

s='hello|world|python'
lst=s.split(sep='|')

s='hello|world|python'
lst=s.split(sep='|',maxsplit=1)#['hello', 'world|python']

字符串判斷的相關(guān)方法

方法 作用
isidentifier() 判斷指定的字符串是否是合法的標(biāo)識(shí)符
isspace() 判斷指定的字符串是否全部由空白字符組成(回車、換行、水平制表符)
isalpha() 判斷指定的字符串是否全部由字母組成
isdecimal() 判斷指定的字符串是否全部由十進(jìn)制的數(shù)字組成
isnumeric() 如果 string 中只包含數(shù)字字符,則返回 True,否則返回 False
isalnum() 判斷指定的字符串是否全部由字母和數(shù)字組成
isdigit() 如果 string 只包含數(shù)字則返回 True 否則返回 False.

https://www.runoob.com/python/python-strings.html
注意:
'張三' 是字母
'四'、'Ⅱ' 是數(shù)字,但不是十進(jìn)制數(shù)字

字符串替換

replace():第1個(gè)參數(shù)指定被替換的子串,第2個(gè)參數(shù)指定替換子串的字符串,該方法返回替換后得到的字符串,替換前的字符串不發(fā)生變化,調(diào)用該方法時(shí)可以通過第3個(gè)參數(shù)指定最大替換次數(shù)

字符串合并

join():將列表或元組中的字符串合并成一個(gè)字符串。

print('-'.join(lst))
print('-'.join('abcd'))#a-b-c-d

字符串的比較

運(yùn)算符:>,>=,<,<=,==,!=

ord(),字符->原始值

print(ord('a'))#97

chr(),原始值->字符

print(chr(97))#a

== 比較的是value是否相等
is 比較的是id是否相等

字符串的切片操作

字符串是不可變類型,不具備增刪改等操作,切片操作將產(chǎn)生新的對象

[start : end : step]

image-20210726162518263

格式化字符串

%作占位符

name = '張三'
age = 20
print('我叫%s,今年%d歲' % (name,age))

print('%10d' % 99)
print('%.3f' % 3.1415926)
print('%10.3f' % 3.1415926)#總寬度為10,小數(shù)點(diǎn)后三位

{}作占位符。Python format 格式化函數(shù)

name = '張三'
age = 20
print('我叫{0},今年{1}歲'.format(name,age))

print('{:.3}'.format(3.1415926))#3.14
print('{0:.3}'.format(3.1415926))#3.14
print('{0:.3f}'.format(3.1415926))#3.142
print('{0:10.3f}'.format(3.1415926))#     3.142
print('{:^10d}'.format(3.1415926))#中間對齊,寬度為10

f-string

name = '張三'
age = 20
print(f'我叫{name},今年{age}歲')

字符串的編碼轉(zhuǎn)換

s='我要吃飯'
print(s.encode(encoding='GBK'))
print(s.encode(encoding='UTF-8'))

輸出:
b'\xce\xd2\xd2\xaa\xb3\xd4\xb7\xb9'
b'\xe6\x88\x91\xe8\xa6\x81\xe5\x90\x83\xe9\xa5\xad'

在GBK編碼格式中,一個(gè)中文占2個(gè)字節(jié)
在UTF-8編碼格式中,一個(gè)中文占3個(gè)字節(jié)

byte=s.encode(encoding='GBK')
print(byte.decode(encoding='GBK'))
byte=s.encode(encoding='UTF-8')
print(byte.decode(encoding='UTF-8'))

十、函數(shù)

函數(shù)的創(chuàng)建和調(diào)用

def clac(a,b):#形參
    c=a+b
    return c

print(clac(2,3))#實(shí)參

函數(shù)的參數(shù)傳遞

位置實(shí)參:根據(jù)形參對應(yīng)的位置進(jìn)行實(shí)參傳遞。用法如上↑

關(guān)鍵詞實(shí)參:根據(jù)形參名稱進(jìn)行實(shí)參傳遞

def clac(a,b):
    print('a='+str(a))
    print('b='+str(b))
    return

clac(2,3)#a=2 b=3
clac(b=2,a=3)#a=3 b=2

在函數(shù)調(diào)用過程中,進(jìn)行參數(shù)傳遞:
如果是不可變對象,在函數(shù)體的修改不會(huì)影響實(shí)參的值。
如果是可變對象,在函數(shù)體的修改會(huì)影響實(shí)參的值。
列表傳的是地址,在函數(shù)里append追加元素后,調(diào)用結(jié)束了,在原列表中依舊在

函數(shù)的返回值

如果函數(shù)沒有返回值,return可以省略不寫
函數(shù)的返回值如果是1個(gè),直接返回類型
函數(shù)的返回值如果是多個(gè),返回的結(jié)果為元組

def fun(num):
    odd=[]
    even=[]
    for i in num:
        if i%2:
            odd.append(i)
        else:
            even.append(i)
    return odd,even

print(fun([1,3,5,6,7,8,9,20]))
#([1, 3, 5, 7, 9], [6, 8, 20])

函數(shù)的參數(shù)定義

函數(shù)定義默認(rèn)值參數(shù)

def clac(a=30,b=100):
    print('a='+str(a))
    print('b='+str(b))
    return

clac()#a=30  b=100
clac(2)#a=2  b=100

個(gè)數(shù)可變的位置參數(shù)

定義函數(shù)時(shí),可能無法事先確定傳遞的位置實(shí)參的個(gè)數(shù)時(shí),使用可變的位置參數(shù)
使用*定義個(gè)數(shù)可變的位置形參
結(jié)果為一個(gè)元組
每個(gè)函數(shù)只能定義一個(gè)

def fun(*a):
    print(a)
fun(1,2,3,4)#(1, 2, 3, 4)
def fun(*lst):

在函數(shù)調(diào)用時(shí),將列表中的每個(gè)元素都轉(zhuǎn)換為位置實(shí)參傳入

個(gè)數(shù)可變的關(guān)鍵字形參

定義函數(shù)時(shí),無法事先確定傳遞的關(guān)鍵字實(shí)參的個(gè)數(shù)時(shí),使用可變的關(guān)鍵字形參
使用**定義個(gè)數(shù)可變的關(guān)鍵字形參
結(jié)果為一個(gè)字典
每個(gè)函數(shù)只能定義一個(gè)

def fun(**arg):
    print(arg)
    print(arg['a'],arg['c'])
fun(a=1,b=2,c=3)

輸出:
{'a': 1, 'b': 2, 'c': 3}
1 3

def fun(**dic):

在函數(shù)調(diào)用時(shí),將字典中的鍵值對都轉(zhuǎn)換為關(guān)鍵字實(shí)參傳入

在一個(gè)函數(shù)定義過程中,既有個(gè)數(shù)可變的關(guān)鍵字形參,又有個(gè)數(shù)可變的位置形參。要求個(gè)數(shù)可變的位置形參放前面,個(gè)數(shù)可變的關(guān)鍵字形參放后面

def fun(*a,**arg):
def fun(a,b,*,c,d,**arg):
def fun(a,b=10,*,c,d,**arg):

↓從*之后的參數(shù),在函數(shù)調(diào)用時(shí),只能采用關(guān)鍵字參數(shù)傳遞

def fun(a,b,*,c,d):
    print('a=',a)
    print('b=',b)
    print('c=',c)
    print('d=',d)
fun(10,20,d=30,c=40)

變量的作用域

局部變量、全局變量

遞歸函數(shù)

組成部分:遞歸調(diào)用與遞歸終止條件

算階乘:

def fun(num):
    if num==1:
        return 1
    return fun(num-1)*num
print(fun(6))

斐波那契數(shù)列:

def fib(num):
    if(num==1 or num==2):
        return 1
    return fib(num-1)+fib(num-2)
for i in range(1,8):
    print(fib(i),end=' ')

十一、異常處理

bug的由來及分類

常見錯(cuò)誤:
1.末尾冒號(hào)
2.縮進(jìn)錯(cuò)誤
3.英文符號(hào)
4.字符串+數(shù)字拼接
5.沒有定義變量
6.==和=

不同異常類型的處理方式

異常處理機(jī)制

image
try:
  # res=1/0
  # res='a'/1
  res = 3/2
except ZeroDivisionError:
  print('除數(shù)為0')
except BaseException as e:
  print('其它異常',e)
else:
  print('沒有異常',res)
finally:
  print('無論是否產(chǎn)生異常,都會(huì)被執(zhí)行的代碼')

finally可以用來釋放資源

Python常見的異常類型

異常類型 描述
ZeroDivisionError 除(或取模)零(所有數(shù)據(jù)類型)
IndexError 序列中沒有此索引(index)
KeyError 映射中沒有這個(gè)鍵
NameError 未聲明/初始化對象(沒有屬性)
SyntaError Python語法錯(cuò)誤
ValueError 傳入無效的參數(shù)

traceback模塊:打印異常信息

import traceback
try:
  a=1/0
except:
  # pass
  traceback.print_exc()

異常后續(xù)可以存儲(chǔ)到文件中

raise 手動(dòng)拋出異常

語法格式:

raise [Exception [, args [, traceback]]]

try:
  x = 10
  if x > 5:
      raise Exception('x 不能大于 5。x 的值為: {}'.format(x)
except Exception as e:
      print(e)

PyCham的調(diào)試模式

十二、類與對象

兩大編程思想

面向過程:事務(wù)比較簡單,可以用線性的思維去解決

面向?qū)ο?/p>

類和對象的創(chuàng)建

不同的數(shù)據(jù)類型屬于不同的類。100、99、520都是int類下包含實(shí)例/對象

Python中一切皆對象(有id、內(nèi)存空間、值)

創(chuàng)建類的語法
類的組成:類屬性、實(shí)例方法、靜態(tài)方法、類方法

在類之外定義的稱為函數(shù),在類之內(nèi)定義的稱為方法

class Student:#取名規(guī)范:由一個(gè)或多個(gè)單詞組成,每個(gè)單詞的首字母大寫,其余小寫
  native='吉林' #類屬性

  def __init__(self,name,age):  #初始化
    self.name=name    #self.name 稱為實(shí)例屬性,進(jìn)行了一個(gè)賦值操作,將局部變量的name的值賦給實(shí)體屬性
    self.agee=age      #self后面的不一定要叫name、age。但是習(xí)慣上局部變量和屬性名相同

  def eat(self):  #實(shí)例方法
    print('實(shí)例方法的輸出')

  @staticmethod #靜態(tài)方法
  def me():
    print('我使用了staticmethod進(jìn)行修飾,所以我是靜態(tài)方法')

  @classmethod  #類方法
  def cm(cls):
    print('我使用了classmethod進(jìn)行修飾,所以我是類方法')

對象的創(chuàng)建(類的實(shí)例化)

stu1=Student('張三',20)

使用

stu1=Student('張三',20)
stu1.eat()          #對象名.方法名()
Student.eat(stu1)   #類名.方法名(類的對象self)
print(stu1.name)
print(Student.native)
Student.native='天津' #native被共享,一改,其它對象的native也跟著改
print(stu1.native)
Student.cm()    #類方法
Student.me()    #靜態(tài)方法

動(dòng)態(tài)綁定

綁定屬性

stu1.gender='女'
print(stu1.gender)

對象創(chuàng)建之后,又給stu1增加一個(gè)屬性。而這個(gè)屬性只能在stu1用,stu2是不能用的,沒有定義。

綁定方法

def show():
  print('我是一個(gè)函數(shù)')
stu1.show=show
stu1.show()#我是一個(gè)函數(shù)

同樣,stu2也不能用show方法

十三、對象

面向?qū)ο笕筇卣鳎悍庋b(安全性)、繼承(復(fù)用性)、多態(tài)(擴(kuò)展性、可維護(hù)性)

封裝

在python中沒有專門的修飾符用于屬性的私有,如果該屬性不希望在類對象外部被訪問,前邊加2個(gè)_下劃線

class Student:
  def __init__(self,name,age):
    self.name=name
    self.__age=age  #不想被外部訪問
  def show(self):
    print(self.name,self.__age)

stu=Student('張三',20)
print(stu.name)
# print(stu.__age)#會(huì)報(bào)錯(cuò)
print(stu._Student__age)

繼承

python支持多繼承??梢杂泻枚鄠€(gè)父類。所有類型的共同父類是Object

class Person(object):
  def __init__(self,name,age):
    self.name=name
    self.age=age
  def info(self):
    print('姓名:{0},年齡:{1}'.format(self.name,self.age))

class Student(Person):
  def __init__(self,name,age,score):
    super().__init__(name,age)
    self.score=score
    
stu=Student('小紅',20,'80')
stu.info()#姓名:小紅,年齡:20

方法重寫

super()表示調(diào)用父類

在子類中也可以重寫父類,用同一個(gè)方法名

def info(self):
  super().info()
  print(self.score)

Object類

print(dir(對象/類))可以顯示現(xiàn)在有多少方法

object有一個(gè)__str__()方法,用于返回一個(gè)對于對象的描述。print(對象)原本輸出對象的內(nèi)存地址。我們可以把它重寫,讓它輸出屬性值。

class Student:
  def __init__(self,name,age)
    self.score=score
  def __str__(self):
    return '名字{0},今年{1}歲'.format(self.name,self.age)
  
stu=Student('小紅',20,'80')
print(stu)#名字小紅,今年20歲

一般會(huì)在寫完這個(gè)類的時(shí)候再去重寫__str__方法,用于返回對象的描述

多態(tài)

在運(yùn)行過程中,根據(jù)變量所引用的對象的類型,動(dòng)態(tài)決定調(diào)用哪個(gè)對象的方法

動(dòng)態(tài)語言(python)(崇尚鴨子類型):不需要關(guān)系對象是什么類型,只關(guān)心對象的行為

靜態(tài)語言(java)實(shí)現(xiàn)多態(tài)的三個(gè)必要條件:繼承、方法重寫、父類引用指向子類對象

特殊方法和特殊屬性

特殊屬性

名稱 描述
__dict__ 獲得類對象所綁定的屬性和方法的字典,或?qū)嵗龑ο髮傩缘淖值?/td>
__class__ 輸出對象所屬的類
__bases__ 父類類型的元素
__base__ 輸出一個(gè)距離它最近的父類(定義時(shí)誰寫前邊就輸出誰)
__mro__ 查看類的層次結(jié)構(gòu)
__subclasses__() 子類的列表

特殊方法

名稱 描述
__len__() 通過重寫_len_()方法,讓內(nèi)置函數(shù)len()的參數(shù)可以是自定義類型
__add__() 通過重寫_add_()方法,可使自定義對象具有“+”功能
__new__() 用于創(chuàng)建對象
__init__() 對創(chuàng)建的對象進(jìn)行初始化
c=a+b
d=a.__add__(b)
class Student:
  def __init__(self,name):
    self.name=name
  def __add__(self, other):
    return self.name+other.name

stu1=Student('張三')
stu2=Student('李四')
s=stu1+stu2
print(s)

先new新建,再init初始化

image-20210727225056600

類的淺拷貝與深拷貝

變量的賦值操作

只有一個(gè)對象的實(shí)例,用了兩個(gè)變量去指。同一個(gè)對象賦給了兩個(gè)變量

淺拷貝

python拷貝一般都是淺拷貝,拷貝時(shí),對象包含的子對象內(nèi)容不拷貝。
因此,源對象與拷貝對象會(huì)引用同一個(gè)子對象。

深拷貝

使用copy的deepcopy函數(shù),遞歸拷貝對象中包含的子對象,源對象和拷貝對象所有的子對象也不相同

cpu=Cpu()
disk=Disk()
computer=Computer(cpu,disk)

computer1=computer  #賦值

import copy
computer2=copy.copy(computer)#淺拷貝。對象地址不同,子對象地址相同

computer3=copy.deepcopy(computer)#深拷貝。對象地址、子對象地址都不相同

十四、模塊化

什么叫模塊

Modules,一個(gè)模塊可以包含N多個(gè)函數(shù)。在Python中一個(gè)擴(kuò)展名為.py的文件就是一個(gè)模塊。使用模塊:方便其它程序/腳本導(dǎo)入并使用;避免函數(shù)名和變量沖突;提高代碼的可維護(hù)性;提高代碼的可重用性

自定義模塊

創(chuàng)建模塊:新建一個(gè).py文件,名稱盡量不要與Python自帶的標(biāo)準(zhǔn)模塊名稱相同

導(dǎo)入模塊:

import 模塊名稱 [as 別名]

form 模塊名稱 import 函數(shù)/變量/類
import math
print(pow(2,3))#8
print(math.pow(2,3))#8.0
print(math.ceil(9.001))#10
print(math.floor(9.999))#9

新建一個(gè)calc.py

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

在要用的地方導(dǎo)入模塊使用

方法1

import calc
print(calc.add(1,2))

方法2

from calc import add
print(add(1,2))
image-20210728105241940

老師說要標(biāo)記一下。。但是我不標(biāo)記沒報(bào)錯(cuò)。。

以主程序的形式執(zhí)行

每個(gè)模塊都有一個(gè)記錄模塊名稱的變量__name__,程序可以檢查該變量,以確定他們在哪個(gè)模塊中執(zhí)行。頂級(jí)模塊的__name__變量的值為__main__

#calc.py
def add(a,b):
  return a+b

if __name__ == '__main__':
  print('只有在運(yùn)行calc時(shí)才輸出這句話')

python中的包

包是一個(gè)分層次的目錄結(jié)構(gòu),它將一組功能相近的模塊組織在一個(gè)目錄下

作用:
代碼規(guī)范、避免模塊名稱沖突

包與目錄的區(qū)別:
包含__init__.py文件的目錄稱為包
目錄里通常不包含__init__.py文件

使用import方式進(jìn)行導(dǎo)入時(shí),只能跟包名或模塊名

import calc
import pg1

使用from…import 可以導(dǎo)入包、模塊、函數(shù)、變量

from pg1 import moduleA
from pg1.moduleA import a

Python中常用的內(nèi)置模塊

模塊名 描述
sys 與Python解釋器及其環(huán)境操作相關(guān)的標(biāo)準(zhǔn)庫
time 提供與時(shí)間相關(guān)的各種函數(shù)的標(biāo)準(zhǔn)庫
os 提供了訪問操作系統(tǒng)服務(wù)功能的標(biāo)準(zhǔn)庫
calendar 提供了與日期相關(guān)的各種函數(shù)的標(biāo)準(zhǔn)庫
urllib 用于讀取來自網(wǎng)上(服務(wù)器)的數(shù)據(jù)標(biāo)準(zhǔn)庫
json 用于使用json序列化和反序列化對象
re 用于在字符串中執(zhí)行正則表達(dá)式匹配和替換
math 提供標(biāo)準(zhǔn)算術(shù)運(yùn)算函數(shù)的標(biāo)準(zhǔn)庫
decimal 用于進(jìn)行精確控制運(yùn)算精度、有效數(shù)位和四舍五入操作的十進(jìn)制運(yùn)算
logging 提供了靈活的記錄事件、錯(cuò)誤、警告和調(diào)試信息等日志信息的功能
import sys
print(sys.getsizeof(24))
print(sys.getsizeof(True))
print(sys.getsizeof(False))
import time
print(time.time())
print(time.localtime())
import urllib.request
print(urllib.request.urlopen('http://www.baidu.com').read())
import math
print(math.pi)

第三方模塊的安裝及使用

第三方模塊的安裝

在cmd中pip install schdule。(建議直接在pyCharm里import然后按提示安裝)
pip不識(shí)別的話記得配置環(huán)境變量。系統(tǒng)變量path中放入python目錄下C的Scripts

import schedule
import time

def job():
  print('haha')
schedule.every(3).seconds.do(job)
while True:
  schedule.run_pending()
  time.sleep(1)

十五、文件

編碼格式介紹

Python的解釋器使用的是Unicode(內(nèi)存)
.py文件在磁盤上使用UTF-8存儲(chǔ)(外存)

image-20210728144456232

文件的讀寫原理

image-20210728145042628

文件讀寫操作

file=open('a.txt','r')
print(file.readlines())
file.close()

輸出:
['中國\n', '好吃']

常用的文件打開方式
文本文件:存儲(chǔ)的是普通“字符”文本,默認(rèn)為unicode字符集,可以使用記事本程序打開
二進(jìn)制文件:把數(shù)據(jù)內(nèi)容用“字節(jié)”進(jìn)行存儲(chǔ),無法用記事本打開,必須使用專用的軟件打開。如:mp3、jpg、doc

打開方式 描述
r 以只讀模式打開文件,文件的指針將會(huì)放在文件的開頭
w 以只寫模式打開文件,如果文件不在則創(chuàng)建。如果文件存在,則覆蓋原有內(nèi)容,文件指針在文件的開頭
a 以追加模式打開文件,如果文件不存在則創(chuàng)建,文件指針在文件開頭。如果文件存在,則在文件末尾追加內(nèi)容,文件指針在原文件末尾
b 以二進(jìn)制方式打開文件,不能單獨(dú)使用,需要與其他模式一起使用,rb、或者wb
+ 以讀寫方式打開文件,不能單獨(dú)使用,需要與其他模式一起使用,a+

文件拷貝:

src_file=open('logo.png','rb')
target_file=open('copylogo.png','wb')
target_file.write(src_file.read())

target_file.close()
src_file.close()

文件對象常用的方法

方法 說明
read([size]) 從文件中讀取size個(gè)字節(jié)或字符內(nèi)容返回,若省略[size],則讀取到文件末尾,即一次讀取文件所有內(nèi)容
readlines() 從文本文件中讀取一行內(nèi)容
write(str) 把文本文件中每一行都作為獨(dú)立的字符串對象,并將這些對象放入列表中返回
writelines(s_list) 將字符串列表s_list寫入文本文件,不添加換行符
seek(offset[,whence]) 把文件指針移動(dòng)到新的位置,offset表示相對于whence的位置:<br />offset:正,往結(jié)束方向移動(dòng)。負(fù),往開始方向移動(dòng)<br />whence:0,從文件頭開始計(jì)算。1,從當(dāng)前位置開始計(jì)算。2,從文件尾開始計(jì)算
tell() 返回文件指針的當(dāng)前位置。從0開始計(jì)算
flush() 把緩沖區(qū)的內(nèi)容寫入文件,但不關(guān)閉文件
close() 把緩沖區(qū)的內(nèi)容寫入文件,同時(shí)關(guān)閉文件,釋放文件對象相關(guān)資源

with語句(上下文管理器)

with語句可以自動(dòng)管理上下文資源(不用手動(dòng)關(guān)閉),不論什么原因(是否產(chǎn)生異常)跳出with塊,都能確保文件正確的關(guān)閉,以此來達(dá)到釋放資源的目的
自動(dòng)調(diào)用__enter__、__exit__方法

文件賦值↓

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

目錄操作

os模塊——操作系統(tǒng)相關(guān)的一個(gè)模塊

import os
os.system('notepad.exe')
os.startfile("D:\\Program Files\\Typora\\Typora.exe")

打開記事本。相當(dāng)于在運(yùn)行(win+R)中寫notepad。
calc計(jì)算器

os模塊操作目錄:

函數(shù) 說明
getcwd() 返回當(dāng)前的工作目錄
listdir(path) 返回指定路徑下的文件和目錄信息
mkdir(path[,mode]) 創(chuàng)建目錄
makedirs(path1/path2...[,made]) 創(chuàng)建多級(jí)目錄
rmdir(path) 刪除目錄
removedirs(path1/path2...) 刪除多級(jí)目錄
chdir(path) 將path設(shè)置為當(dāng)前工作目錄

os.path模塊操作目錄相關(guān)函數(shù):

函數(shù) 說明
abspath(path) 用于獲取文件或目錄的絕對路徑
exists(path) 用于判斷文件或目錄是否存在,存在返回Ture,否則返回False
join(path,name) 將目錄與目錄或文件名拼接起來
split() 拆分目錄和文件
splitext() 分離文件名和擴(kuò)展名
basename(path) 從一個(gè)目錄中提取文件名
dirname(path) 從一個(gè)路徑中提取文件路徑,不包括文件名
isdir(path) 用于判斷是否為路徑

列出指定目錄下的所有py文件

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

endswith()表示以...結(jié)尾

walk可以編歷目錄下的各種子目錄文件

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

十六、學(xué)生信息管理系統(tǒng)

需求分析

系統(tǒng)設(shè)計(jì)

錄入學(xué)生信息
查找學(xué)生信息
刪除學(xué)生信息
修改學(xué)生信息
學(xué)生成績排名
統(tǒng)計(jì)學(xué)生總?cè)藬?shù)
顯示全部學(xué)生信息

系統(tǒng)開發(fā)必備

主函數(shù)設(shè)計(jì)

學(xué)生信息維護(hù)模塊設(shè)計(jì)

錄入學(xué)生信息功能:從控制臺(tái)錄入學(xué)生信息,并且把它們保存(save())到磁盤文件中

def save(lst):
  try:
    stu_txt=open(filename,'a',encoding='UTF-8')
  except:
    stu_txt=open(filename,'w',encoding='UTF-8')
  for item in lst:
    stu_txt.write(str(item)+'\n')
  stu_txt.close()

刪除學(xué)生信息

def delete():
  while True:
    student_id=input('請輸入要?jiǎng)h除的學(xué)生的ID:')
    if student_id!='':
      if os.path.exists(filename):#如果文件存在在目錄下
        with open(filename,'r',encoding='UTF-8') as file:
          student_old=file.readlines()
      else:
        student_old=[]
      flag=False  #標(biāo)記是否刪除
      if student_old:
        with open(filename,'w',encoding='UTF-8') as wfile:
          # d={}
          for item in student_old:
            d=dict(eval(item))  #將字符串轉(zhuǎn)成字典
            if d['id']!=student_id:
              wfile.write(str(d)+'\n')
            else:
              flag=True
          if flag:
            print(f'id為{student_id}的學(xué)生信息已被刪除')
          else:
            print(f'沒有找到id為{student_id}的學(xué)生')
      else:
        print('無學(xué)生數(shù)據(jù)')
        break
      show()  #刪完之后重新顯示所有學(xué)生信息
      answer=input('是否繼續(xù)刪除?y/n\n')
      if answer=='y' or answer=='Y':
        continue
      else:
        break

d=dict(eval(item)) #將字符串轉(zhuǎn)成字典

修改學(xué)生信息

查詢學(xué)生信息:
展示↓

def show_student(lst):
  if len(lst)==0:
    print('沒有查詢到學(xué)生信息,無數(shù)據(jù)顯示!!')
    return
  #定義標(biāo)題顯示格式
  format_title='{:^6}\t{:^12}\t{:^8}\t{:^10}\t{:^10}\t{:^8}'
  print(format_title.format('ID','姓名','英語成績','python成績','java成績','總成績'))
  #定義內(nèi)容的顯示格式
  format_data='{:^8}\t{:^8}\t{:^8}\t{:^8}\t{:^8}\t{:^8}'
  for item in lst:
    print(format_data.format(item.get('id'),item.get('name'),item.get('english'),item.get('python'),item.get('java'),int(item.get('english')+item.get('python')+item.get('java'))))

統(tǒng)計(jì)學(xué)生總?cè)藬?shù)

顯示所有學(xué)生信息

排序模塊設(shè)計(jì)

sort()函數(shù)用于對原列表進(jìn)行排序,如果指定參數(shù),則使用比較函數(shù)指定的比較函數(shù)。

list.sort( key=None, reverse=False)
  • key -- 主要是用來進(jìn)行比較的元素,只有一個(gè)參數(shù),具體的函數(shù)的參數(shù)就是取自于可迭代對象中,指定可迭代對象中的一個(gè)元素來進(jìn)行排序。

  • reverse -- 排序規(guī)則,reverse = True 降序, reverse = False 升序(默認(rèn))。

lambda ※

tudent_new.sort(key=lambda x:int(x['english']),reverse=asc_or_desc_bool)
def sort():
  show()
  if os.path.exists(filename):
    with open(filename,'r',encoding='UTF-8') as rfile:
      student_lst=rfile.readlines()
      student_new=[]
      for item in student_lst:
        d=dict(eval(item))
        student_new.append(d)
  else:
    return
  while True:
    asc_or_desc=input('請選擇(0.升序 1.降序):')
    if asc_or_desc=='0':
      asc_or_desc_bool=False
      break
    elif asc_or_desc=='1':
      asc_or_desc_bool = True
      break
    else:
      print('您的輸入有誤,請重新輸入')
  while True:
    mode=input('請選擇排序方式(1.按英語成績排序 2.按Python成績排序 3.按java成績排序 4.按總成績排序):')
    if mode!='1' and mode!='2'and mode!='3'and mode!='4':
      print('您的輸入有誤,請重新輸入')
      sort()
      continue
    elif mode=='1':
      student_new.sort(key=lambda x:int(x['english']),reverse=asc_or_desc_bool)
    elif mode=='2':
      student_new.sort(key=lambda x:int(x['python']),reverse=asc_or_desc_bool)
    elif mode == '3':
      student_new.sort(key=lambda x:int(x['java']),reverse=asc_or_desc_bool)
    elif mode=='4':
      student_new.sort(key=lambda x:int(x['english'])+int(x['python'])+int(x['java']),reverse=asc_or_desc_bool)
    break
  show_student(student_new)

項(xiàng)目打包

安裝:pip install PyInstaller

打包:pyinstaller -F D:\study\python\16-\stusystem.py

打包完之后倒數(shù)第二行:10833 INFO: Appending archive to EXE C:\WINDOWS\system32\dist\stusystem.exe

然而每次要修改文件的時(shí)候就會(huì)閃退,我也不知道為什么。┑( ̄Д  ̄)┍

十七、實(shí)操案例

print輸出

輸出到文件

fp=open('D:/test.txt','w')
print('輸出到文件',file=fp)
fp.close()

文件讀寫

有賦值的輸出

循環(huán)list輸出、字典輸出、字典的內(nèi)置函數(shù)zip()

lst_name=['林黛玉','薛寶釵','賈元春','賈探春','史湘云']
lst_sig=['①','②','③','④','⑤']
for i in range(5):
  print(lst_sig[i],lst_name[i])

d={'①':'林黛玉','②':'薛寶釵','③':'賈元春','④':'賈探春','⑤':'史湘云'}
for key in d:
  print(key,d[key])

for s,name in zip(lst_sig,lst_name):
  print(s,name)

有顏色的輸出

\033[顯示方式; 前景色; 背景色m****\033[0m

其中******表示被標(biāo)記的內(nèi)容。可以缺省書寫,使用默認(rèn)設(shè)定。

print('\033[0:35m圖書音像勛章\033[m')
image-20210729002615535

進(jìn)制轉(zhuǎn)換

num=int(input('請輸入一個(gè)十進(jìn)制的整數(shù):'))
print(num,'的二進(jìn)制數(shù)為:',bin(num))
print(str(num)+'的二進(jìn)制數(shù)為:'+bin(num))
print('%s的二進(jìn)制數(shù)為:%s' % (num,bin(num)))
print('{0}的二進(jìn)制數(shù)為:{1}'.format(num,bin(num)))
print(f'{num}的二進(jìn)制數(shù)為:{bin(num)}')

print(f'{num}的八進(jìn)制數(shù)為:{oct(num)}')
print(f'{num}的十六進(jìn)制數(shù)為:{hex(num)}')

支付密碼格式驗(yàn)證

s='支付密碼合法' if pwd.isdigit() else '支付密碼只能是數(shù)字'

數(shù)字競猜(隨機(jī)數(shù))

price=random.randint(1000,2000)

車票購買

dict={'aaa':['1','2','3'],
      'bbb':['4','5','6']}
for item in dict:
  print(item)
  for i in dict[item]:
    print(i)

對字典dict進(jìn)行for…in,item表示的是key值
對列表lst進(jìn)行for…in,item表示的是lst[i],也就是元素值(而不是索引)

咖啡購買(元組編歷)

enumerate() 函數(shù):用于將一個(gè)可遍歷的數(shù)據(jù)對象(如列表、元組或字符串)組合為一個(gè)索引序列,同時(shí)列出數(shù)據(jù)和數(shù)據(jù)下標(biāo),一般用在 for 循環(huán)當(dāng)中。

t1=('hello','world',80)
for index,item in enumerate(t1):
  print(f'{index} {item}')

也可以逆向查找

print(t1[2])

高鐵售票

下載模塊:prettytable

import prettytable as pt

tb=pt.PrettyTable()
tb.field_names=['行號(hào)','座位1','座位2','座位3','座位4']
for i in range(4):
  lst=[f'第{i}行','有票','有票','有票','有票']
  tb.add_row(lst)
print(tb)

可以顯示整齊的表格

image-20210729141803122

計(jì)算日期

用到模塊:datetime

import datetime
sdate=datetime.datetime.strptime('2021-07-29','%Y-%m-%d')
fdate=sdate+datetime.timedelta(days=20)
print(f'20天之后是{fdate}')
print(f'20天之后是{str(fdate).split(" ")[0]}')

輸出:
20天之后是2021-08-18 00:00:00
20天之后是2021-08-18

記錄查看登陸日志

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容