程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python基礎

編輯:Python

涵蓋Python基礎語法,掌握基礎的編程能力


Python基礎語法

認識Python

Python是一種面向對象解釋型計算機程序設計語言,由吉多.范羅蘇姆開發,第一個公開發行版發布於1991年,它常被成為膠水語言,能夠把其他語言制作的各種模塊(尤其是C/C++),恆輕松的聯結在一起。

  1. Python優點

    1. 簡單易學
    2. 免費開源

      Python開源,開發者可以自由的下載,閱讀,甚至是修改Python源代碼

    3. 豐富的第三方庫

      Python具有本身且豐富而且強大的庫,而且由於Python的開源性,第三方庫也非常多,例如:在web開發有django.flask,Tornado,爬蟲scrapy,科學計算numpy.pandas等等

    4. 可以移植

      由於Python是開源的,他已經被移植到了大多數平台下面,例如:Windows,MacOS,Linux,Andorid,iOS等等

    5. 面向對象

      Python既支持面向過程,又支持面向對象,這樣編程就更加靈活

  2. Python缺點

    1. 運行速度慢

      C程序相比非常慢,因為Python是解釋型語言,代碼在執行時會一行一行的翻譯成CPU能夠理解的機器碼,這個翻譯過程非常的耗時,所以很慢,而C程序時運行前直接編譯成CPU能執行的機器碼,所以相對Python而言,C語言執行非常快

    2. 代碼不能加密

      要發布你寫的程序,實際上時發布源代碼,而是解釋型的語言,則必須把源代碼發布出去

    3. 強制的縮進

      Python有非常嚴格的縮進語法,只要縮進錯誤程序立馬崩潰

    4. GIL全局解釋器鎖

      在任意時刻,只有一個線程在解釋器中運行,對Python虛擬機的訪問由全局解釋器鎖(GIL)來控制,正式這個鎖能夠保證同一時刻只有一個線程在運行,遇到i/o阻塞的時候會釋放(GIL)所以Python的多線程並不是真正的多線程,而是CPU執行速度非常快,讓人感覺不到GIL的存在。(GIL)會在Python高級階段講解

    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-2eiqPEK6-1657892353562)(1.png)]

     學了Python能干什麼
    

掌握Python注釋

注釋是編寫程序時,寫程序的人給人一句、程序段、函數等的解釋或提示
注釋的作用:
注釋可以起到一個備注的作用,這個方法函數,變量到底是干嘛的,如果沒有注釋時間長了即使是自己寫的代碼,可能都不知道這個代碼到底是干嘛的,所以注釋起到的作用就是方便自己查看寫過的代碼,別人來接收你的代碼能看懂,簡單來將就是提高程序代碼的可讀性,以便於以後的參看、修改
Python中單行注釋用#號,#號右邊就是注釋的內容,Python解析器遇到#號就會當作注釋,不會去解析#號後面的內容
多行注釋 ‘’‘代碼… ‘’’


掌握Python變量的定義與命名規則

  • 變量=存儲的數據
  • 變量是一段有名字的連續的存儲的空間,我們可以通過定義變量來申請並命名這樣的存儲空間,並通過變量的名字來使用這段存儲空間
  • 變量是程序中臨時存放數據的場所
    Python是一種強類型的語言,賦值變量時候不需要指定數據類型,給這個變量賦值什麼數據類型,這個變量就是什麼類型
#x就是變量,當x=2結果就是6 x=10結果就是30
x=2
y=x*3
print(y)

命名規則
變量必須以字母(a-z A-Z)下劃線(_)開頭,其他字符可以是字母數字下劃線 ,變量區分大小寫,Python關鍵字不能作變量名

_Name='張三'
name='劉德華'
print(_Name,name)

命名規范

  • 簡明知意,盡量使用有語義的單詞命名,如使用Password用作密碼,username用作用戶名
  • 小駝峰式命名法:第一個單詞首字母小寫其他單詞首字母大寫如userName
  • 大駝峰式命名法:全部單詞首字母都用大寫,如UserName
  • 下劃線命名法:每個單詞用_下劃線連接,如user_name

掌握Python基本操作符

  • 算數運算符:+ - * / **(指數) %(取余) //(相除取整)

定兩個變量a=7,y=3

算數運算符作用描述示例+ 加法算術加法a+b=10-減法算數減法a-b=4*乘法算數乘法x*y=21**指數左邊的數是底數,右邊的數是指數a* *b=343%取余x%y x除以y的余數a%b=1/除法x/y結果包含小數點後面的數a/b=2.33333333335//相除取整x//y 結果是忽略小數點後面的小數位,只保留整數位a//b=2
  • 比較運算符:==(等於) !=(不等於) > < >= <=

返回布爾型 True False

比較運算符名稱示例結果描述==等於x==y如果x恰好等於y,則為真!=不等於x!=如果x恰好不等於y 則為真>大於x>y如果x(左側參數)大於y(右邊參數),則為真<小於x< y如果x(左側參數)小於y(右邊參數),則為真>=大於或等於x>=y如果x(左側參數)大於或者等於y(右邊參數),則為真<+小於或者等於x<=y如果x(左側參數)小於或者等於y(右邊參數),則為真
  • 邏輯運算符 and or not
邏輯運算符實例結果描述andx and yx,y同為真,則結果為真,如果有一個為假,則結果為假orx or yx, y有一個為真,結果就為真,全部為假,則結果為假notnot x取反,如果x為真,則結果為假,如果x為假,則結果為真

a=1
b=2
c=3
d=5
print(a>b and d>c) #結果為假
print(a>b or d>c)#結果為真
print(not a>d) #結果為真

優先級:()–>not–>and–>or

print(2>1 and 1<4 or 2<3 and 9>6 or 2<4 and 3<2) #True
賦值運算符作用描述結果描述=賦值運算符將=號右邊的值賦值給左邊的變量+=加法賦值運算符c+=a等效於c=c+a-=減法賦值運算符c-=a等效於c=c-a*=乘法賦值運算符c*=a等效於c=c*a/=除法賦值運算符c/=a等效於c=c/a%=取模賦值運算符c%=a等效於c=c%a**=冪賦值運算符c* =a等效於c=c *a//=取整賦值運算符c//=a等效於c=c//a
a,b,c,d=23,10,18,3
a+=3
print(a)

掌握Python輸入輸出

輸出 %占位符

  • Python 有一個簡單的字符格式化方法,使用%做占位符,%後面跟的是變量的類型 %s %d
  • 在輸出時,若果有\n,此時\n後的內容會在另外一行顯示 換行
name ='張三'
classPro='北京大學'
age =22
print('我的名字是%s:來自%s 今年%d歲了'%(name,classPro,age))
me ='我的'
classP='清華附中一年級3班'
age1=7
print('%s名字是小明,來自%s,我今年%d歲了'%(me,classP,age1))
print('我可以\n換行嗎')
  • %c 字符
  • %s 通過str()字符串轉換來格式化
  • %d 有符號十進制整數
  • %u 無符號十進制整數
  • %f浮點數
print('\n')
print('-------------test---------------')
print('\n')
ID='老夫子'
QQ=66666666
number=13467204515
address='廣州市白雲區'
print('========================================')
print('姓名:%s'%ID)
print('QQ: %d'%QQ)
print('手機號碼:%d'%number)
print('公司地址:%s'%address)
print('========================================')
print('\n')

格式化輸出另外一種方式


print('---------格式化輸出另外一種方式.format------------')
print('姓名:{}'.format(ID))
print('QQ:{}'.format(QQ))
print('手機號碼:{}'.format(number))
print('公司地址:{}'.format(address))

輸入 input

Python中提供input 方法來獲取鍵盤輸入
input接收的鍵盤輸入都是str類型,如果接收數字類型需要將str轉成int


name=input('請輸入姓名')
age2=int(input('請輸入年齡:'))
qq=input('請輸入QQNumber:')
phone=input('請輸入手機號:')
addr=input('請輸入地址:')
print('姓名:%s 年齡是%d'%(name,age2))
print('QQ:{}'.format(qq))
print('手機號碼:{}'.format(phone))
print('公司地址:{}'.format(addr))

Python流程控制

  • Python條件語句是通過一條或多條語句的執行結果【True/False】來決定執行的代碼塊
  • 就是計算機執行代碼的順序
  • 流程控制:對計算機代碼執行的順序進行有效的管理,只有流程控制才能實現在開發當中的業務邏輯
  • 流程控制的分類:
    • 順序流程 :就是代碼一種自上而下的執行結構,也是python默認的流程
    • 選擇流程/分支流程:根據在某一步的判斷,有選擇的去執行相應的邏輯的一種結構
      • 單分支 if 條件表達式:
      • 雙分支 if 條件表達式: else:
      • 多分支 if 條件表達式: elif 條件表達式: elif 條件式: else:
      • 條件表達式:比較運算符/邏輯運算符/符合運算符
    • 循環流程: 在一定的條件下,一直重復的去執行某段代碼的邏輯【事情】
      • while 條件表達式:
      • for 變量 in 可迭代的集合對象

單分支

score = 80
if score<=60: #滿足條件就會輸出打印提示
print('成績不太理想,繼續加油')
pass #空語句
print('語句運行結束')

雙分支

if score>60:
print('成績不錯')
else:
print("成績不合格,繼續努力")

多分支

  • 特征:只要滿足其中一個分支,就會退出本層if 語句結構【必定會執行其中一個分支】
  • 至少有2種情況可以選擇
  • elif後面必須嘚寫上條件和語句
  • else 是選配,根據實際的情況來填寫

grade=int(input('請輸入成績:'))
if grade>90:
print('您的成績是A等')
pass
elif grade>=80:
print('您的成績是B等')
pass
elif grade >=70:
print('您的等級是C等')
pass
elif grade >=60:
print('您的等級是D等')
pass
else:
print('你個廢物蛋')
print('程序運行結束.........')

if-else 嵌套

  • 一個場景需要分階段或者層次,做出不同的處理
  • 要執行的if語句一定要外部的if 語句滿足條件才可以,
xuefen=int(input('請輸入你的學分'))
if xuefen >10:
grade = int(input('請輸入你的成績'))
if grade>=80:
print('你可以升班了。。。恭喜您')
pass
else:
print('很遺憾,您的成績不達標....')
pass
pass
else:
print('您的表現也太差了吧0')

循環分類 while for

while語法結構

語法特點
# 1.有初始值
# 2.條件表達式
# 3.變量【循環體內計數變量】的自增自減,否則會造成死循環

  • 使用條件:循環的次數不確定,是依靠循環條件來結束
  • 目的: 為了將相似或者相同的代碼操作變得更加簡潔,使得代碼可以使用重復利用

for循環

  • 遍歷操作,依次的取集合容器中的每個值
tage='我是一個中國人'#字符串類型本身就是一個字符類型的集合
for item in tage:
print(item)
pass
#range 此函數可以生成一個數據集合的列表
#range(起始值:結束值:步長)步長不能為0
sum=0
for data in range(1,101):#數據做包含,右邊不包含1-100
sum+=data
pass
#print(data,end=' ')
print(sum)
print('sum=%d'%sum)
# print('sum={}'.format(sum))
#
for message in range(50,201):
if message%2==0:
print('%d是偶數'%message)
pass
else:
print('{}是奇數'.format(message))
# break 代表中斷結束,滿足條件直接結束本層循環
# continue 結束本次循環,繼續進行下次循環, (當continue條件滿足的時候,本次循環剩下的語句將不在執行,後面的循環繼續)
#這兩個關鍵字只能用在循環中

while:適用於對未知的循環次數 【用於判斷】
for :適應於已知的循環次數【可迭代對象遍歷】

99乘法表用for實現

#九九乘法表
for i in range(1,10):
for j in range(1,i+1):
print('%d*%d=%d'%(i,j,i*j),end=' ')
print()#控制換行
print('--------------------------------------------------------')
print('\n')

案例 輸入1-100之間的數據

#輸入1-100之間的數據
index =1#定義變量
while index<=100:
print(index)
index+=1
pass

案例猜拳游戲

#案例猜拳游戲
import random
count =1
while count<=10:
person =int(input('請出拳:【0 石頭 1 剪刀2布】\n'))
computer=random.randint(0,2)#隨機數范圍
if person==0 and computer==1:
print('你真厲害')
pass
elif person==1 and computer==2:
print('你可真棒')
pass
elif person==2 and computer==0:
print('你真厲害')
pass
elif person==computer:
print('不錯嘛,竟然平手')
pass
else:
print('你輸了')
pass
count+=1

九九乘法表

#打印九九乘法表
i=1
while i<=9:
j=1
while j<=i:
print('%d*%d=%2d'%(i,j,i*j),end=" ")
j+=1
pass
print()
i+=1
pass

直角三角形

#直角三角形
row=9
while row>=1:
j=1
while j<=row:
print('*',end=' ')
j+=1
pass
print()
row-=1
pass

等腰三角形

#等腰三角形
i=1
while i<=10:
j1=1
while j1<=10-i:#控制打印沒空格的數量
print(' ',end='')
j1+=1
pass
k=1
while k<=2*i-1:#控制打印*號
print('*',end='')
k+=1
print()
i+=1
pass

猜年齡小游戲

有三點要求:
1.允許用戶最多嘗試3次
2.每嘗試3次後,如果還沒有猜對,就問用戶是否還想繼續玩,如果回答Y或y,就讓繼續猜3次,以此往後,如果回答N或n,就退出程序
3.如果猜對了,直接退出


# # import random
#
# # for i in range(3):
# # computer = random.randint(20, 22)
# # person = int(input('請輸入年齡:'))
# # if person == computer:
# # print('恭喜您答對了')
# # break
# #
# # else:
# # print('猜錯了')
# # zimu=input('是否繼續:繼續請輸入Y或者y 結束請輸入N或n')
# # if zimu=='Y' or zimu =='y':
# # pass
# # elif zimu=='N' or zimu=='n':
# # exit()
time =0
count=3
while time<=3:
age =int(input('請輸入您要猜的年齡:'))
if age ==25:
print('您猜對了:')
break
elif age >25:
print('您猜大了')# else:
print('您猜小了')
time+=1
if time==3:
choose=input('還想繼續嗎?Y/N')
if choose == 'Y' or choose=='y':
time=0#重置為初始值
elif choose=='N' or choose=='n':
exit()
else:
print('請輸入正確的符號..謝謝配合')

小王身高1.75,體重80.5kg,請根據BMI公式,【體重除以身高的平方】,幫助小王計算他的BMI指數,並根據BMI指數

低於18.5 過輕
18.5-25 正常
25-28 過重
28-32 肥胖
高於32 嚴重肥胖
用if-elif 判斷並打印出來


high=1.75
weight=80.5
BMI=weight/(high*high)
print('BMI的數據是{}'.format(BMI))
if BMI<18.5:
print('過輕')
elif 18.5<=BMI<25:
print('正常')
elif 25<=BMI<28:
print('過重')
elif 28<=BMI<32:
print('肥胖')
else:
print('嚴重肥胖')
## Python數據類型
>掌握Python的基本數據類型
* 數字
* int(有符號整數)
* long(長整數)(Python3版本取消了)
* float(浮點型)
* complex(復數)
* bool(布爾值)
* 返回 True False
* 字符串
* 字典
* 元組
* 列表
```python
a=[]
print(type(a)) #type方法可以查看變量的類型
b=10
print(type(b))

Python數據類型

字符串

  • 序列:一組按順序排列的值,【數據集合】

  • Python 中存在3中內置的序列類型:
    ‘’’
    字符串 列表 元組
    ‘’’

  • 序列優點:支持索引和切片操作

  • 特征:第一個正索引為0,指向的是左端, 第一個索引為負數,指向的是右端

  • 切片是指截取字符串中的某一段內容,

  • 切片使用語法:[起始下標:結束下標:步長] 切片截取的內容不包含結束下標對應的數據,步長指的是隔幾個下標獲取一個字符

  • 下標會越界,切片不會:


Test='python'
print(type(Test))
print(Test[0])#獲取第一個字符
print('獲取第二個字符%s'%Test[1])
for i in Test:
print(i,end=' ')
name='peter'
print('首字母大寫:%s'%name.capitalize())
a=' python '
print(a.strip())#去除兩邊的空格
print(a.lstrip())#去除左邊空格
print(a.rstrip())#去除右邊空格
#賦值字符串
b=a
print(b)
print(id(a))#查看內存地址
print(id(b))
str="I Love Python"
print(str.find('P'))#返回對應的下標 查找目標對象在序列中對應的位置 沒找到返回-1
print(str.index('v'))#index()檢測字符串中是否包含子字符串,返回對應下標,沒找到就報錯
print(str.startswith('I'))#返回布爾型 判斷是否以什麼什麼開始
print(str.endswith('i'))#判斷是否以什麼什麼結尾
print(str.lower())#全部轉小寫
print(str.upper())#全部轉大寫
st='hello world'
print(st[0])
print(str[::-1])#逆序輸出
print(st[2:5])#從下標2開始不包含5【左閉右開】
print(st[2:])#從第三個字符到最後
print(st[0:3])#從0開始可以省略0
print(st[:3])

列表

  • 特點:
    ‘’’
    支持增刪改查
    列表中的數據是可以變化的,【數據項可以變化,內存地址不會改變】
    用[]來表示列表類型,數據項之間用逗號來分割, 注意:數據項可以說任意的數據類型
    ‘’’

list=[]#空列表
print(list)
print(len(list))#獲取列表對象 中數據個數
str='lodsa'
print(len(str))
  • 查找

listA=['abcd',123,456,798,True,12.255]
print(listA)
print(listA[0])#找出第一個元素
print(listA[1:3])
print(listA[3:])
print(listA[::-1])#倒敘
print(listA*3)#輸出多次列表中數據【復制多次】
  • 添加

print('------------------增加---------------------')
listA.append('Jay')
listA.append([1,1,2,'dfgs',{
"al":12}])
print(listA)
listA.insert(1,'插入的元素')#插入操作,需要指定插入位置
# reData=list(range(10))#強制轉換list對象
listA.extend([12,45,484])#擴展,批量添加
print(listA)
  • 修改
print('-----------------修改--------------')
print('修改之前',listA)
listA[0]='Peter'
print('修改之後',listA)
  • 刪除

print('----------------------刪除---------------')
del listA[0] #刪除列表中第一個元素
print(listA)
del listA[1:3]#批量刪除
print(listA)
listA.remove(798)#指出指定元素
print(listA)
listA.pop(0)#移除第一個元素 #根據下標來移除
print(listA)

元組

  • 元組是不可變序列,在創建後不能做任何修改

  • 可變

  • 用()來創建元組類型,數據項用逗號來分割

  • 可以是任何類型

  • 當元組中只有一個元素時,要加上逗號,不然解釋器會當作整形處理

  • 同樣支持切片操作

  • 查找


tupleA=()#空列表
tupleA=('abcd',123,12.55,[123,45,'45hf'])
print(tupleA)
print(tupleA[2])
print(tupleA[1:3])
print(tupleA[::-1])
print(tupleA[::-2])
print(tupleA[-2:-1:])#倒著取下標, -2到-1區間的數據
print(tupleA[-4:-1])
  • 修改

tupleA[3][0]=250#對元組中的列表類型的數據進行修改
tupleB=tuple(range(10))
print(tupleB.count(9))

字典

  • 字典不是序列類型,沒有下標的概念,是一個無序的鍵值集合,是內置的高級數據類型

  • 字典可以存儲任意對象

  • 字典以鍵值對的形式創建的{key:value}利用大括號包裹

  • 字典中中某個元素時,時根據鍵 ,值 字典的每個元素由2部分組成:鍵:值

  • 訪問值的安全方法get()方法,在我們不確定字典中是否存在某個鍵而又想獲取其值時,可以使用get()方法,還可以設置默認的值

  • 添加字典數據


dictA={
"pro":"藝術專業","school":'上海戲劇學院'}
dictA['name']='李易峰'
dictA['age']=29
print(dictA)
print(len(dictA))
print(dictA['name'])#通過鍵獲取值
dictA['name']='成龍'#修改鍵對應的值
print(dictA)
print(dictA.keys())#獲取所有的鍵
print(dictA.values())#獲取所有的值
print(dictA.items())#獲取所有的鍵和值
for key,value in dictA.items():
# print(item)
print('%s值==%s'%(key,value))
dictA.update({
'age':32})#更新 存在就更新,不存在就添加
dictA.update({
"height":1.78})#添加
print(dictA)
  • 刪除

del dictA['name']
dictA.pop('age')
print(dictA)

共有方法

#+ 合並
strA='人生苦短'
strB='我用Python'
print(strA+strB)
List_A=list(range(10))
list_B=list(range(10,21))
print(List_A+list_B)
# * 復制
print(strA*3,end=' ')
print(List_A*3)
# in 判斷對象是否存在
print('我' in strA)
print(10 in list_B)

Python函數

掌握Python函數基礎,為開發項目打下堅實的基礎

函數初識

  • 在編寫程序的過程中,有某一功能代碼塊出現多次,但是為了提高編寫的效率以及代碼的重用,所以把具有獨立功能的代碼塊組織為一個小模塊,這就是函數

  • 就是一系列Python語句的組合,可以在程序中運行一次或者多次,

  • 一般具有獨立的功能

  • 代碼的復用最大化以及最小化冗余代碼,整體代碼結構清晰,問題局部化

  • 函數定義

    def 函數名():
    函數體【一系列語句,表示獨立的功能】
    函數調用
    調用之前先定義
    函數名加()即可調用
    函數說明文檔:
    函數內容的第一行可以用字符串進行 函數說明

  • 函數定義


def pritInfo():
'''
這個函數用來打印小張信息
'''
#函數代碼塊
print('小張的身高是%f'%1.73)
print('小張的體重是%f'%130)
print('小張的愛好是%s'%'周傑倫')
print('小張的專業是%s'%'信息安全')
  • 函數 調用
pritInfo()
  • 進一步去輸出不同人的信息, 通過傳入參數來解決

def pritInfo(name,height,weight,hobby,pro):
#函數代碼塊
print('%s的身高是%f'%(name,height))
print('%s的體重是%f'%(name,weight))
print('%s的愛好是%s'%(name,hobby))
print('%s的專業是%s'%(name,pro))
  • 調用帶參數的信息

pritInfo('peter',175,130,'聽音樂','甜品師')
pritInfo('小李',189,140,'打游戲','軟件工程師')

函數參數

  • 參數分類:

必選參數,默認參數【缺省參數】,可選參數,關鍵字參數

  • 參數:其實就是函數為了實現某項特定功能,進而為了得到實現功能所需要的數據
    為了得到外部數據
    def sum(a,b):#形式參數:只是意義上的一種參數,在定義的時候是不占內存地址的

    sum=a+b
    print(sum)

  • 必選參數

函數調用的時候,必選參數是必須要賦值的
sum(20,15)#20,15就是實際參數 實參, 實實在在的參數,是實際占用內存地址的
sum()不能這樣寫,需要傳參

  • 默認參數【缺省參數】

def sum(a=1,b=11):
print(a+b)
sum()
  • sum(10)#在調用的時候,如果未賦值,就用定義函數時給定的默認值

  • 可變參數(當參數的個數不確定時,比較靈活)

def getComputer(*args):
''' 計算累加和 '''
# print(args)
result=0
for item in args:
result+=item
print(result)
getComputer(1)
getComputer(1,2,3,4)
  • 關鍵字可變參數
  1. **來定義
  2. 在函數體內 參數關鍵字是一個字典類型,key是一個字符串
# def Func(**kwargs):
# print(kwargs)
# Func(name='趙頌')
# def Infofunc(*args,**kwargs): #可選參數必須在關鍵字可選參數之前
# print(args)
# print(kwargs)
# Infofunc(1,2)
# Infofunc(12,13,46,age=18)
  • 接收N 個數字,求這些參數數字的和

def num(*args):
''' #寫函數,接收N 個數字,求這些參數數字的和 '''
result=0
for i in args:
result+=i
return result
a=num(1,2,2,2,2)
print(a)
  • 找出傳入的列表或元組的奇數位對應的元素,並返回一個新的列表
def Func1(con):
''' 找出傳入的列表或元組的奇數位對應的元素,並返回一個新的列表 '''
listA=[]
index=1
for i in con:
if index%2==1:#判斷奇數位
listA.append(i)
index+=1
return listA
# e=Func1([1,2,45,1,1,'as',{1,25,',hs'}])
e=Func1(list(range(1,11)))
print(e)
  • 檢查傳入字典的每一個value的長度,如果大於2,那麼僅僅保留前兩個長度的內容,並將新的內容返回給調用者,PS:字典中的數據只能是字符串或者是列表
def Func2(dic):
''' 檢查傳入字典的每一個value的長度,如果大於2,那麼僅僅保留前兩個長度的內容, 並將新的內容返回給調用者,PS:字典中的數據只能是字符串或者是列表 '''
result={
}
for key,value in dic.items():
if len(value)>2:
result[key]=value[:2]#向字典添加新的數據
else:
result[key]=value
return result
#調用
dicObj={
'name':'張三','hobby':['唱歌','跳舞','編程'],'major':'信息安全'}
print(Func2(dicObj))

函數返回值

  • 概念:函數執行完以後會返回一個對象,如果在函數的內部有return,就可以返回實際的值,否則返回None
  • 類型:可以返回任意 類型,返回值類型應該取決於return 後面的類型
  • 用途:給調用方返回數據
  • 在一個函數體內可以出現多個return ,但是肯定只有一個return
  • 如果在一個函數體內,執行了return,意味著就執行完成推出了,return後面的代碼將不會執行
#返回值
def Sum(a,b):
sum=a+b
return sum #將計算結果返回
result=Sum(12,15)#將返回的值賦給其他變量
print(result)
def calComputer(num):
''' 累加和 '''
listA=[]
result=0
i=1
while i<=num:
result+=i
i+=1
# listA.append(result)
listA.append(result)
return listA
message=calComputer(10)
print(type(message))
print(message)
def returnType():
''' 返回元組類型數據 '''
return 1,2,3
a =returnType()
print(type(a))
print(a)
def returnType1():
''' 返回字典類型 '''
return {
"name":"成龍"}
b=returnType1()
print(type(b))
print(b)

函數嵌套

def fun1():
print("------------------fun1start")
print("--------------------執行代碼省略")
print("-------------------fun1end")
def fun2():
print('------------------fun2start')
#調用第一個函數
fun1()
print("---------------------fun2end")
fun2()
#函數分類:根據函數返回值和函數參數決定
#有參數無返回值
#有參數有返回值
#無參數無返回值
#無參數有返回值

函數全局變量

  • 局部變量:就是在函數內部定義的變量【作用域僅僅局限在函數的內部】
  • 不同的函數,可以定義相同的局部變量,但是各自用各自的 不會產生影響.
  • 局部變量的作用:為了臨時的保存數據,需要在函數中定義來進行存儲.
  • 當全局變量和局部變量出現重復定義的時候,程序會優先執行函數定義的內部變量.
  • 如果函數內部要想對全局變量進行修改,必須使用global關鍵字進行聲明.

# pro='信息安全'#全局變量
# name='周潤發'
# def printInfo():
# name='劉德華'#局部變量
# print('{}'.format(name))
#
# def TestMethod():
# name='peter'#局部變量
# print(name)
# printInfo()
# TestMethod()
#
#
# def message():
# print(pro)
#
# message()
#
pro='123'
def changGlobal():
global pro
pro='456'
print(pro)
changGlobal()

引用

  • 在Python中,值是靠引用來傳遞來的,可以用id()查看一個對象的引用是否相同.

  • id是值保存在內存中那塊內存地址的標識.

  • 不可變類型

a=1
def func(x):
print('x的地址{}'.format(id(x)))
x=12
print('修改之後的x 的地址:{}'.format(id(x)))
print('a的地址:{}'.format(id(a)))
func(a)
  • 可變類型

li=[]
def testRenc(parms):
print(id(parms))
li.append([1,2,3,54])
print(id(li))
testRenc(li)
print('外部變量對象{}'.format(li))
  • 小結
  1. python中,萬物皆對象,在函數調用的時候,實參傳遞的就是對象的引用,
  2. 了解了原理之後,就可以更好的去把控,在函數內部的處理是否會影響到外部數據的變化
  3. 參數傳遞是通過對象引用來完成 參數傳遞是通過對象引用來完成 參數傳遞是通過對象引用來完成

匿名函數

  • 語法

lambda 參數1、參數2、參數3:表達式

  • 特點

    • 使用lambda關鍵字創建函數
    • 沒有名字的函數
    • 匿名函數冒號後面的表達式只有一個,注意:是表達式,而不是語句
    • 匿名函數自帶return,而這個return的結果是表達式計算後的結果
  • 缺點

    • lamdba只能是單個表達式:不是一個代碼塊,lamdba的設計就是為了滿足簡單的函數場景
    • 僅僅能封裝有限的邏輯,復雜邏輯實現不了,必須使用def來處理
#匿名函數
m=lambda x,y:x+y
#通過變量去調用匿名函數
print(m(23,19))
M=lambda a,b,c:a*b*c
print(M(1,2,3))
age =15
print('可以繼續參軍,'if age>18 else'繼續上學')
C=lambda x,y:x if x>y else y
print(C(1,5))
re=(lambda x,y:x if x<y else y)(16,12)
print(re)
Rs=lambda x:(x**2)+890
print(Rs(10))

遞歸函數

如果一個函數在內部不調用其他函數,而是調用自己本身,這個函數就是遞歸函數

遞歸 自己調用自己
必須有一個明確的結束條件

  • 階乘/通過遞歸實現
#階乘/通過遞歸實現
def factorial(n):
''' 階乘 '''
if n==1:
return 1
return n*factorial(n-1)
result =factorial(5)
print(result)
  • 通過普通函數實現階乘
#通過普通函數實現階乘
def jiecheng(n):
''' 階乘 '''
result=1
for item in range(1,n+1):
result*=item
return result
re=jiecheng(5)
print(re)
#模擬實現,樹形結構的遍歷
import os #引入文件操作模塊
def findFile(file_Path):
listRs=os.listdir(file_Path)#得到該路徑下面的文件夾
for fileItem in listRs:
full_Path=os.path.join(file_Path,fileItem)#獲取完整的文件路徑
if os.path.isdir(full_Path):#判斷是否是文件夾
findFile(full_Path)#如果是一個文件,再次去遍歷
else:
print(fileItem)
else:
return
#d調用搜索文件對象
findFile('D:\\Python')

內置函數 數學運算

#Python語言自帶的函數
print(abs(-23))#取絕對值
print(round(2.23))#近似值
print(round(12.56,1))#保留一位小數
print(pow(3,3))#次方
print(3**3)#次方
print(max(12,15,18))#返回最大值
print(min(12,15))#最小值
print(sum(range(50)))
#eval 執行表達式
a,b,c=1,2,3
print('動態生成的函數{}'.format(eval('a+b+c')))

類型轉換函數

#chr() 數字轉字符
#bin() 轉為二進制
#hex() 轉為十六進制
#oct() 轉八進制
#list()將元組轉列表
print(bin(10))
print(hex(16))
tupleA=(132,2,2,23,1)
print(list(tupleA))
listA=[1,123,15,',ghdj']
print(tuple(listA))
# bytes轉換
print(bytes('我喜歡Python',encoding='utf-8'))

序列操作函數

#sorted()函數對所有可迭代的對象進行排序操作 生成一個新的進行排序
#sort() 在原有數據基礎上進行排序
#all()
#range()
list=[1,2,3,45,6]
# list.sort()#直接修改原始對象
print('-------------排序之前-----------{}'.format(list))
# varList=sorted(list)
varList=sorted(list,reverse=True)#降序排序
# varList=sorted(list,reverse=False)#升序排序
print('-------------排序之後-----------{}'.format(varList))

set集合

#set 不支持索引切片,是一個無序的且不重復的容器
#類似於字典,但是只有Key,沒有value
set1={
1,2,3}
set1.add(123)#添加操作
set1.clear() #清空
print(set1)
List1=['1','2','24']
set2=set(List1)
print(set2)
re=set1.difference(set2)# 差集, a中有的b中沒有的
print(re)
print(set1-set2)#差集
print(set1.intersection(set2))#交集
print(set1&set2)#交集
print(set1.union(set2)) #並集
print(set1 | set2)#並集
#pop 就是從集合中拿數據並且同時刪除
print(set1)
set1.pop()
print(set1)
set1.discard(3)#指定移除元素
print(set1)
#update兩個集合
set1.update((set2))
print(set1)

Python面向對象

介紹Python面向對象開發,為開發項目打下堅實的基礎

oop介紹

面向對象編程 oop 【object oriented programming】是一種Python的編程思路

  • 面向過程:
    在思考問題的時候,怎麼按照步驟去實現,
    然後將問題解決拆分成若干個步驟,並將這些步驟對應成方法一步一步的最終完成功能

  • 面向過程:就是一開始學習的,按照解決問題步驟去編寫代碼【根據業務邏輯去寫代碼】

  • 面向對象:關注的是設計思維【找洗車店, 給錢洗車】

  • 從計算機角度看:面向過程不適合做大項目

  • 面向過程關注的是:怎麼做

  • 面向對象關注的是:誰來做


類和對象

  • 類:是一個模板,模板裡包含多個函數,函數裡實現一些功能

  • 對象:則是根據模板創建的實例,通過實例對象可以執行類中的函數

  • 類由3部分構成:

    • 類的名稱:類名
    • 類的屬性:一組數據
    • 類的方法:允許對進行操作的方法(行為)

例如:創建一個人類
事物的名稱(類名):人(Person)
屬性:身高,年齡
方法;吃 跑…

  • 類是具有一組 相同或者相似特征【屬性】和行為【方法】的一系列對象的集合

現實世界 計算機世界
行為------》方法
特征------》屬性

  • 對象:是實實在在的一個東西,類的具象化 實例化
  • 類是對象的抽象化 而對象是類的實例

定義類

#定義類和對象
#類名:采用大駝峰方式命名


#創建對象
#對象名=類名()
''' class 類名: 屬性 方法 '''
#實例方法 :
# 在類的內部,使用def關鍵字可以定義一個實例方法,與一般函數 定義不同,類方法必須包含參數self【self可以是其他的名字,但是這個位置必須被占用】,且為第一個參數
#屬性:在類的 內部定義的變量
#定義在類裡面,方法外面的屬性成為類屬性,定義在方法裡面使用self引用的屬性稱之為實例屬性
class Person:
''' 對應人的特征 '''
name='小勇' #類屬性
age=22 #類屬性
''' 對應人的行為 '''
def __int__(self):
self.name = '小趙'#實例屬性
def eat(self):#實例方法
print('狼吞虎咽的吃')
def run(self):#實例方法
print('飛快地的跑')
#創建對象【類的實例化】
xm=Person()
xm.eat()#調用函數
xm.run()
print('{}的年齡是{}'.format(xm.name,xm.age))

__init__方法

# 如果有n個這樣對象 被實例化,那麼就需要添加很多次實例屬性,顯然比較麻煩
class Person1:
def __init__(self):#魔術方法
''' 實例屬性的聲明 '''
self.name='小勇'
self.age=22
self.sex='男生'
def run(self):
print('跑太快了吧')
xy=Person1()
# xy.run()
print(xy.age)

self理解

  • self和對象指向同一個地址,可以認為self就是對象的引用
  • 在實例化對象時,self不需要開發者傳參,Python自動將對象傳遞給self
  • self只有類中定義實例方法的時候才有意義,在調用的時候不必傳入相應的參數,
  • 而是由解釋器自動取指向
  • self的名字時可以更改的,可以定義成其他的名字,只是約定俗成的定義成了self
  • self指的是類實例對象本身
class Person:
def __init__(self,pro):
self.pro=pro
def geteat(s,name,food):
# print(self)
print('self在內存中的地址%s'%(id(s)))
print('%s喜歡吃%s,專業是:%s'%(name,food,s.pro))
zs=Person('心理學')
print('zs的內存地址%s'%(id(zs)))
zs.geteat('小王','榴蓮')

魔術方法

魔術方法: __ xxx __


''' __init__ 方法:初始化一個類,在創建實例對象為其賦值時使用 __str__方法 : 在將對象轉換成字符串str(對象)測試的時候,打印對象的信息 __new__方法 : 創建並返回一個實例對象,調用了一次,就會得到一個對象 __class__方法 : 獲得已知對象的類(對象__class__) __del__方法: 對象在程序運行結束後進行對象銷毀的時候調用這個方法,來釋放資源 '''
class Animal:
def __init__(self,name,color):
self.name=name
self.color=color
print('--------init-------')
def __str__(self):
return '我的名字是%s,我的顏色為%s'%(self.name,self.color)
def __new__(cls, *args, **kwargs):
print('--------new-------')
return object.__new__(cls)
dog =Animal('旺財','黑色')
print(dog)
''' __new__和__init__函數區別 __new__類的實例化方法:必須返回該實例 否則對象就創建不成功 __init__用來做數據屬性的初始化工作,也可以認為是實例的構造方法,接收類的實例 self 並對其進行構造 __new__至少有一個參數是cls是代表要實例化的類,此參數在實例化時由Python解釋器自動操作 __new__函數執行要早於__init__函數 '''

析構方法


''' 當一個對象被刪除或者被銷毀是,python解釋器會默認調用一個方法,這個方法為__del__()方法,也被成為析構方法 '''
class Animals:
def __init__(self,name):
self.name=name
print('這是構造初始化方法')
def __del__(self):
print('當在某個作用域下面,沒有被引用的情況下,解釋器會自動調用此函數,來釋放內存空間')
print('這是析構方法')
print('%s 這個對象被徹底清理了,內存空間被釋放了'%self.name)
cat=Animals('貓貓')
# del cat #手動的清理刪除對象
input('程序等待中......')
#當整個程序腳本執行完畢後會自動的調用_del_方法
# 當對象被手動摧毀時也會自動調用_del_方法
# 析構方法一般用於資源回收,利用_del_方法銷毀對象回收內存資源

單繼承

Python中展現面向對象的三大類型: 封裝,繼承,多

  1. 封裝:值得是把內容封裝到某個地方,便於後面的使用
    他需要:
    把內容封裝到某個地方,從另外一個地方去到調用被封裝的內容
    對於封裝來說,其實就是使用初始化構造方法將內容封裝到對象中,然後通過對象直接或者self來獲取被封裝的內容

  2. 繼承:和現實生活當中的繼承是一樣的,也就是子可以繼承父的內容【屬性和行為】(爸爸有的兒子有, 相反, 兒子有的爸爸不一定有),

  3. 所謂多態,定義時的類型和運行時的類型是不一樣,此時就成為多態


class Animal:
def eat(self):
''' 吃 '''
print('吃')
def drink(self):
''' 喝 '''
print('喝')
class Dog(Animal):#繼承Animal父類, 此時Dog就是子類
def wwj(self):
print('汪汪叫')
class Cat(Animal):
def mmj(self):
print('喵喵叫')
d1=Dog()
d1.eat()#繼承了父類的行為
d1.wwj()
c1=Cat()
c1.drink()
c1.eat()
''' 對於面向對象的繼承來說,其實就是將多個子類共有的方法提取到父類中, 子類僅僅需要繼承父類而不必一一去實現 這樣就可以極大提高效率,減少代碼的重復編寫,精簡代碼的層級結構 便於擴展 class 類名(父類): pass '''

多繼承

class shenxian:
def fly(self):
print('神仙會飛')
class Monkey:
def chitao(self):
print('猴子喜歡吃桃子')
class SunWuKong(shenxian,Monkey):
pass
swk=SunWuKong()
swk.fly()
swk.chitao()
#當多個父類當中存在相同方法時候,
class D:
def eat(self):
print('D.eat')
class C(D):
def eat(self):
print('C.eat')
class B(D):
pass
class A(B,C):
pass
a=A()
# b=B()
a.eat()
print(A.__mro__)#可以現實類的依次繼承關系 查找執行順序
#在執行eaet方法時,順序應該是
#首先到A裡面去找,如果A中沒有,則就繼續去B類中去查找,如果B中沒有,則去C中查找,
#如果C類中沒有,則去D類中查找,如果還沒有找到,就會報錯
#A-B-C-D 也是繼承的順序

重寫父類方法

  • 所謂重寫,就是子類中,有一個和父類相同名的方法,在子類中的方法會覆蓋掉子類中同名的方法,
  • 為什麼要重寫,父類的方法已經不滿足子類的需要,那麼子類就可以重寫父類或者完善父類方法

class Father:
def smoke(self):
print('抽芙蓉王')
def drink(self):
print('喝二鍋頭')
class Son(Father):
#與父類的(抽煙)方法同名,這就是重寫父類方法
def smoke(self):
print('抽中華')
#重寫父類方法後,子類調用父類方法時,將調用的是子類的方法
son=Son()
son.smoke()

多態

  • 所謂多態,定義時的類型和運行時的類型是不一樣,此時就成為多態

#要想實現多態,必須有兩個前提需要遵守:
''' 1.繼承:多態必須放生在父類和子類之間 2.重寫:子類重寫父類的方法 '''
class Animal:
''' 基類[父類] '''
def say(self):
print('我是一個動物'*10)
class Dark(Animal):
''' 子類【派生類】 '''
def say(self):
''' 重寫父類方法 '''
print('我是一個鴨子'*10)
class Dog(Animal):
def say(self):
print('我是一只'*10)
# dark=Dark()
# dark.say()
#統一的去調用
def commonInvoke(obj):
obj.say()
list=[Dark(),Dog()]
for item in list:
''' 循環調用函數 '''
commonInvoke(item)

類屬性和實例屬性

  1. 類屬性:就是類對象擁有的屬性,它被所有類對象的實例對象所共有,類對象和實例對象可以訪問

  2. 實例屬性:實例對象所擁有的屬性,只能通過實例對象訪問


class Student:
name ='黎明'#屬於類屬性,就是Student類對象所擁有
def __init__(self,age):
self.age=age #實例屬性
lm=Student(18)
print(lm.name)
print(lm.age)
print(Student.name)#通過Student類對象訪問name屬性
# print(Student.age)#類對象不能訪問實例屬性
#類對象可以被類對象和實例對象共同訪問使用的
#實例對象只能實例對象訪問

類方法和靜態方法

  • 類方法的第一個參數是類對象cls,通過cls引用的類對象的屬性和方法
  • 實例對象的第一個參數是實例對象self,通過self引用的可能是類屬性,也可能是 實例屬性
    ,不過在存在相同名稱的類屬性和實例屬性的情況下,實例屬性的優先級更高
  • 靜態方法中不需要額外定義參數,因此在靜態方法中引用類屬性的話,必須通過類對象來引用

class People:
country='china'
@classmethod #類方法 用classmethod進行修飾
def get_country(cls):
return cls.country#訪問類屬性
@classmethod
def change_country(cls,data):
cls.country=data#修改列屬性的值,在類方法中
@staticmethod
def gatData():
return People.country
@staticmethod
def add(x,y):
return x+y
print(People.gatData())
p=People()
print(p.gatData())#注意:一般情況下,我們不會通過實例對象去訪問靜態方法
print(People.add(1,2))
# print(People.get_country())#通過類對象去引用
# p=People()
# print('通過實例對象訪問',p.get_country())
# People.change_country('英國')
# print(People.get_country())
#由於靜態方法主要來存放邏輯性的代碼,本身和類以及實例對象沒有交互
#也就是說,在靜態方法中,不會涉及到類中方法和屬性的操作
#數據資源能夠得到有效的充分利用
import time
class TimeTest:
def __init__(self,hour,minute,second):
self.hour=hour
self.minute=minute
self.second=second
@staticmethod
def showTime():
return time.strftime('%H:%M:%S',time.localtime())
print(TimeTest.showTime())
# t=TimeTest(2,10,11)
# print(t.showTime())#沒必要通過實例對象訪問靜態方法

私有化屬性

  • 語法:

    • 兩個下劃線開頭,聲明該屬性為私有,不能在類的外部被使用或直接訪問
  • 使用私有化屬性的場景

    1. 把特定的一個屬性隱藏起來,不想讓類的外部進行直接調用
    2. 我想保護這個屬性,不想讓屬性的值隨意的改變,
    3. 保護這個屬性,不想讓派生類【子類】去繼承
  • 要想訪問私有變量一般是寫兩個方法,一個訪問,一個修改,由方法去控制訪問

class Person:
__age =18 #實例一個私有化屬性,屬性名字前面加兩個下劃線
‘’’


class Person:
__hobby = 'dance'
def __init__(self):
self.__name = '李四' # 加兩個下劃線將此屬性私有化,不能再外部直接訪問,在類的內部可以訪問
self.age = 30
def __str__(self):
return '{}的年齡是{},喜歡{}'.format(self.__name, self.age, Person.__hobby) # 調用私有化屬性
def change(self, hobby):
Person.__hobby = hobby
class Studeng(Person):
def printInfo(self):
# print(self.__name)#訪問不了父類中的私有屬性
print(self.age)
pass
xl = Person()
# print(xl.name)#通過類對象,在外部訪問的
print(xl)
xl.change('唱歌') # 修改私有屬性的值
print(xl)
stu = Studeng()
stu.printInfo()
stu.change('Rap')
print(stu)
# print(xl.hobby) # 通過實例對象訪問類屬性
# print(stu.hobby) # 通過實例對象訪問類屬性
# print(Person.hobby) # 通過類對象訪問類屬性

‘’’

  • 小結:
    1. 私有化的【實例】屬性,不能在外部直接的訪問,可以在類的內部隨意的使用
    2. 子類不能繼承父類的私有化屬性,【只能繼承父類公共的屬性和行為】
    3. 在屬性名的前面直接加__,就可以將其私有化
      ‘’’
  • 單下劃線 雙下劃線, 頭尾雙下劃線

_xxx前面加下劃線,以單下劃線開頭表示的是protected類型的變量,即保護類型只能允許其本身與子類進行訪問,不能使用from xxx import *的方式導入
__xxx__前後兩個下劃線,魔術方法,一般是python自帶的,開發者不要創建這類型的方法
xxx_後面單下劃線,避免屬性名與Python關鍵字沖突


私有化方法

  • 概述
    • 私有化方法跟私有化屬性一樣,有些重要的方法,不允許外部調用,防止子類意外重寫,把普通的方法設置成私有化方法
    • 私有化方法一般是類內部調用,子類不能繼承外部不能調用
  • 語法

class A:
def __myname(self): #在方法名前面加兩個下劃線
print(‘小明’)


class Animal:
def __eat(self):
print('吃東西')
def run(self):
self.__eat() # 在此調用私有化方法
print('飛快地跑')
class Bird(Animal):
pass
bird = Bird()
bird.run()

Property函數

# 屬性函數 (property)
class Perons:
def __init__(self):
self.__age = 18
def ger_age(self):#訪問私有實例屬性
return self.__age
def set_age(self, age):#修改私有實例屬性
if age < 0:
print('年齡太小')
else:
self.__age = age
#定義一個類屬性,實現通過直接訪問屬性的形式去訪問私有屬性
age=property(ger_age,set_age)
p=Perons()
print(p.age)
p.age=-1
print(p.age)

文件操作與垃圾回收機制

學習使用Python操作文件,了解Python的垃圾回收機制

  • 文件操作:
    1. 打開文件:open()
    2. WriteFile=open(“./Test.text”, mode=“w”,encoding=“utf-8”)
  • 讀/寫操作
    1. WriteFile.write(“在蒼茫的大海上”)
    2. WriteFile.write(“你好中國”)
  • 關閉文件
    1. WriteFile.close()

以二進制的形式寫數據


''' fobj=open("./Test1.text","wb")# str--->bytes fobj.write("在烏雲和大海之間".encode("utf-8")) fobj.close() '''

二進制形式追加

''' #追加不需要encode() #fobj=open("Test.text","a")# 追加數據 #fobj.write("在烏雲和大海之間\r\n") #fobj.write("海燕像黑色的閃電\r\n") fobj=open("./Test1.text","ab")# str--->bytes fobj.write("今天詩興大發\n".encode("utf-8")) fobj.close() '''

讀文件數據

#fobj=open('./Test.text','r')
fobj=open('./Test.text','rb')
data=fobj.read()
print(data)
print(data.decode("utf-8"))#讀取所有數據
#print(fobj.read(12))#讀取兩個數據
#print(fobj.readline())#讀取一行數據
#print(fobj.readlines())#讀取所有行,返回列表
fobj.close()#文件對象關閉掉
  • with語句,不管在處理文件過程中是否發生異常,都能夠保證with語句執行完畢後已經關閉打開的文件句柄
  • with上下文管理對象
  • 優點:自動釋放關聯的對象
with open("withfile.text",'r') as f:
#f.write("123木頭人")
print(f.read())
  • read r r+ rb rb+
  • r r+ 只讀, 適用普通的讀取場景
  • rb rb+ 適用 文件 ,圖片,視頻,音頻這樣的文件讀取
  • write w w+ wb wb+ a ab
  • w wb+ w+ 每次都會創建文件
  • 二進制讀寫的時候注意編碼問題,默認情況下,寫入文件編碼是gbk
  • a ab a+在原有文件的末尾追加,【文件指針的末尾】,不會每次創建新的文件

正則表達式

學習正則表達式操作字符串
re模塊是用C語言寫的沒匹配速度非常快
其中compile函數根據一個模式字符串和可選的標志參數生成一個正則表達式對象,該對象擁有一系列方法用於正則表大會匹配和替換,re模塊也提供了與這下方法功能完全一致的函數,這些函數適用一個模式字符串做為他們的第一個參數

re.macth方法

  • re.math 嘗試從字符串起始位置匹配,返回match對象,,否則返回None,適用group()獲取匹配成功的字符串
    • 語法:re.match(pattern,string,flags)
參數描述pattern匹配的正則表達式string要匹配的字符串flags標志位,用於控制正則表達式的匹配方式:如:是否匹配大小寫,多行匹配
import re
str='Python is the best language in the world'
result= re.match('P',str)
print(type(result))#<class 're.Match'>
print(result.group())

標志位

  • 如果使用多個標志位,使用|分割,如:re.I|re.M
修飾符描述re.I適匹配對大小寫不敏感re.L做本地化識別匹配re.M多行匹配,影響^ 和$re.S使.匹配包括換行在內的所有字符re.U根據Unicode字符集解析字符,這個標志影響\w,\W ,\b,\Bre.X該標識符通過給予你更靈活的格式以便於你將正則表達式寫得更易於理解。
import re
strData='Python is the best language in the world\
gslfjgldsjgls'
#result= re.match('p',strData,re.I|re.M)#第三個參數 忽略大小寫
#print(type(result))#<class 're.Match'>
#print(result.group())
res=re.match('(.*?)is(.*?)',strData,re.I)
print(res.group(1))
print(res.group(2))

常用匹配規則

符號匹配規則.(點)匹配任意1個字符除了換行符[abc]匹配abc中任意一個\d匹配一個數字0-9\D匹配非數字\s匹配空白 即空格 tab鍵\S匹配非空格\w匹配單詞字符 即a-z A-Z 0-9 _\W匹配非單詞字符

匹配字符數量

符號匹配規則*匹配前一個字符出現0次或者無限次,即可有可無+匹配前一個字符出現1次或者無限次,即至少有1次?匹配前一個字符出現1次或者0次,即要麼有1次要麼沒有{m}匹配前一個字符出現m次{m,}匹配前一個字符至少出現m次{m,n}匹配前一個字符出現從m次到n次

限定匹配數量規則


import re
# * 匹配前一個字符出現0次或者無限次
res=re.match('[a-z][a-z]*','MyPython',re.I)
print(res.group())
# + 匹配前一個字符1次或者無限次 至少一次
res=re.match('[a-zA-Z]+[\w]*','mynAMEDCeisz848s_')
print(res.group())
# ? 匹配前一個字符0次或者1次
res=re.match('[a-zA-Z]+[\d]?','mkohjhjgu8jg8')
print(res.group())
# {min,max} 匹配前一個從min到max次 min max必須是非負整數
#{count}精確匹配次數 {count,}沒有限制
res=re.match('\d{4,}','46145')
if res:
print('匹配成功{}'.format(res.group()))
#匹配郵箱 格式:[email protected]
res=re.match('[a-zA-Z0-9]{6,11}@163.com','[email protected]')
print(res.group())

原生字符串

# path="D:\\1_zhao_File\\1_MarkDown\MarkDown學習使用篇"
# print(path )
import re
#原生字符串 r
print(re.match(r'c:\\a.text','c:\\a.text').group())
#匹配開頭結尾
#^ 匹配字符串開頭
#$ 匹配字符串結尾
# res=re.match('^p.*','python is language')
res=re.match('^p[\w]{5}','python is language')
print(res.group())
res=re.match('[\w]{5,15}@[\w]{2,5}.com$','[email protected]')
print(res.group())

分組匹配


# | 匹配左右任意一個表達式 從左往右
import re
res=re.match('[\w]*|100','100')
print(res.group())
# (ab)分組匹配 將括號中字符作為一個分組
res=re.match('([0-9]*)-(\d*)','123456-464651561')
print(res.group())
print(res.group(1))
print(res.group(2))
# \num 的使用
# htmlTag='<html><h1>Python核心編程</h1></html>'
# res1=re.match(r'<(.+)>(.+)>(.+)</\2></\1>',htmlTag)
# print(res1.group(1))
# 分組 別名的使用 (?P<名字>)
data='<div><h1>www.baidu.com</h1></div>'
res=re.match(r'<(?P<div>\w*)><(?P<h1>\w*)>(?P<data>.*)</\w*></\w*>',data)
print(res.group())

編譯函數


# re.compile 方法
''' compile將正則表達式模式編譯成一個正則表達式對象 reg=re.compile(pattern) result=reg.match(string) 等效於result=re.match(pattern,string) 使用re.compile和保持所產生的正則表達式對象重用效率更高 '''
import re
#compile 可以把字符串編譯成字節碼
#優點:在使用正則表達式進行match時,python會將字符串轉為正則表達式對象
# 而如果使用compile,只需要轉換一次即可,以後在使用模式對象的話無需重復轉換
data='1364'
pattern=re.compile('.*')
#使用pattern對象
res=pattern.match(data)
print(res.group())
#re.search方法
#search在全文中匹配一次,匹配到就返回
data='我愛我偉大的祖國,I love China,China is a great country'
rees=re.search('China',data)
print(rees)
print(rees.span())
print(rees.group())
# print(data[21])
#re.findall方法 匹配所有,返回一個列表,
data='華為牛逼是華人的驕傲'
# res =re.findall('華.',data)
# print(res)
pattern=re.compile('華.')
res=pattern.findall(data)
print(res)
# re.sub方法 實現目標搜索和替換
data1='Pythons是很受歡迎的編程語言'
pattern='[a-zA-Z]+' #字符集范圍 +代表 前導字符模式出現1從以上
res=re.sub(pattern,'C#',data1)
resn=re.subn(pattern,'C#',data1)
print(res)
print(resn)
#re.subn 完成目標的的搜索和替換 還返回被替換的數量,以元組的形式返回
#re.split 是新分割字符串
data='百度,騰訊,阿裡,華為,360,字節跳動'
print(re.split(',',data))

貪婪模式和非貪婪模式

''' python 中默認是貪婪的,總是貪婪的匹配盡可能多的字符,非貪婪相反,總是嘗試匹配盡可能少的字符 在 ” * ? + {m,n}"後面加上 ? 使貪婪變成非貪婪 '''
#貪婪
import re
res=re.match('[\d]{6,9}','111222333')
print(res.group())
#非貪婪
res=re.match('[\d]{6,9}?','111222333')
print(res.group())
content='asdfbsdbdsabsd'
# pattern=re.compile('a.*b')# 貪婪
pattern=re.compile('a.*?b')#非貪婪
res=pattern.search(content)
print(res.group())
#0710-49

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved