前言
由於我現在暫時用不到面向對象程序設計,所以暫且先不學習Python的面向對象程序設計。
本篇包含:字符串及正則表達式、函數、模塊
五、字符串及正則表達式
1、字符串
1.字符串常用操作
(1)拼接字符串
字符串1+字符串2 = 字符串1 字符串2
字符串不可以直接和數值類型相加
(2)計算字符串的長度
字符串的長度,即字符串所佔字節數。
A-Z
、a-z
、0-9
、._空格
等佔一個字節
中文漢字佔2~4字節:UTF-8佔3個;GBK(gb2312)佔2個
1)計算字符串字符的個數
len(string)
#len()函數獲取字符的個數,不管中文還是英文都按一個字符計算
2)計算字符串所佔字節數
len(string.encode()) #計算UTF-8編碼字符長度
len(string.encode("gbk")) #計算GBK編碼字符長度
(3)截取字符串
字符串屬於序列。所以:
1)獲取字符可以使用索引
string[索引值]
2)截取字符串可以使用切片
string[start:end:step]
(4)分割、合併字符串
1)分割字符串:split()
listname = str.split(sep,maxsplit)
#sep指定分隔符,默認值是空白符,如:空格、\n、\t。
#maxsplit分隔次數,-1表示沒有限制
>>> str1 = "你 有 多 自信,\n世界 就有 多 相信你"
>>> str1.split()
['你', '有', '多', '自信,', '世界', '就有', '多', '相信你']
>>> str1.split(" ")
['你', '', '有', '多', '自信,\n世界', '就有', '多', '相信你']
>>> str1.split(" ",5)
['你', '', '有', '多', '自信,\n世界', '就有 多 相信你']
>>> str1.split("\n")
['你 有 多 自信,', '世界 就有 多 相信你']
str1 = "@lemon @qwzf @未完成的歌 @chumen007"
list1 = str1.split(' ') #用空格分隔字符串
for item in list1:
print(item[1:]) #輸出好友,並去掉@
2)合併字符串:join()
strnew = string.join(iterable)
#string合併時的分隔符
#iterable可迭代對象
list1 = ["lemon","qwzf","未完成的歌","chumen007"] #好友列表
str1 = " @".join(list1) #用空格和@連接
str2 = "@" + str1
print("你要@的好友:",str2)
(5)檢索字符串
檢索一個字符串在另一個字符串出現的次數:count()
檢索是否包含子字符串:find()
、index()
、in關鍵字
檢索是否以指定字符串開頭和結尾:startswith()
、endswith()
str.count(sub[,start[,end]])
#sub指定要檢索的子字符串
#start指定檢索的起始位置
#end指定檢索的結束位置
str.find(sub[,start[,end]])
#找到返回首次檢索到子字符串的索引值;沒找到返回-1
#find從左往右找,rfind從右往左找
str.index(sub[,start[,end]])
#找到返回首次檢索到子字符串的索引值;沒找到返回異常
#index從左往右找,rindex從右往左找
str.startswith(prefix[,start[,end]])
str.endswith(prefix[,start[,end]])
#prefix指定要檢索的字符串
#是,返回True;否,返回False
(6)字母的大小寫轉換
1)大寫轉小寫:str.lower()
2)小寫轉大寫:str.upper()
(7)去除字符串中的空格和特殊字符
特殊字符:\t
、\r
、\n
去除字符串左右兩端的空格和特殊字符:str.strip([chars])
去除字符串左側和右側的空格和特殊字符:str.lstrip([chars])
、str.rstrip([chars])
(8)格式化字符串
1)使用%
操作符
'%[-][+][0][m][.n]格式化字符'%exp
#[-]表示左對齊,正數前沒有符號;負數的前加上負號
#[+]表示右對齊,正數前加上正號;負數的前加上負號
#[0]表示右對齊,正數前沒有符號;負數的前有負號,填充空白處,一般和[m]一起使用
#[m]數值所佔寬度
#[0][m]不夠寬度前補0
#[.n]小數點後保留n位數
#格式化字符 格式化成字符串s 格式化成十進制整數d 格式化成浮點數f
#exp要轉換的項
>>> template = '編號:%09d\t 公司名稱:%s\t 官網:http://www.%s.com' #定義模板
>>> item = (6,"百度","baidu") #要轉換內容
>>> print(template%item)
編號:000000006 公司名稱:百度 官網:http://www.baidu.com
2)使用字符串對象的format()
方法(推薦)
str.format(args)
#str模板
#{[index][:[[fill]align][sign][#][width][.precision][type]}
#index設置索引位置
#fill指定空白處填充字符
#align對齊方式:<內容左對齊;>右對齊;=內容左對齊,符號放填充內容的最右側;^內容居中
#sign指定有無符號數
##指定2、8、16進制是否加前綴
#width指定所佔寬度
#.precision指定保留小數位數
#type要格式化字符的類型:s、d、f
#args要轉換的項
>>> template = '編號:{:0>9d}\t 公司名稱:{:s}\t 官網:http://www.{:s}.com' #定義模板
>>> print(template.format(7,"百度","baidu"))
編號:000000007 公司名稱:百度 官網:http://www.baidu.com
2.字符串編碼轉換
ASCII、GBK/GB2312、UTF-8
str:Unicode字符 如:“拼搏到感動自己”
bytes:二進制數據 如:b’\xd2\xb0’和b’mr’
(1)使用encode()方法編碼
將字符串轉換成二進制數據,即str->bytes
str.encode([encoding="utf-8"][,errors="strict"])
#strict遇到非法參數拋出異常
#ignore忽略非法字符
#replace用?替換非法字符
#xmlcharrefreplace使用xml的字符引用
(2)使用decode()方法解碼
bytes->str
str.decode([encoding="utf-8"][,errors="strict"])
str1 = "拼搏到感動自己"
byte1 = str1.encode("GBK")
byte2 = str1.encode("utf-8")
str01 = byte1.decode("GBK")
str02 = byte2.decode("utf-8")
print("原字符串:",str1)
print("GBK編碼:",byte1)
print("UTF-8編碼:",byte2)
print("GBK解碼:",str01)
print("UTF-8解碼:",str02)
2、正則表達式
1.正則表達式
(1)行定位符
^
表示開始
$
表示結束
(2)元字符
常用的除^
、$
外,還有:
(3)限定符
(4)字符類[]
如:匹配元音字母[aeiou]、匹配漢字[\u4e00-\u9fa5]
(5)排除字符^
^
放到[]
中表示排除,如[^a-zA-Z]
(6)選擇字符|
如:[a-z]|[0-9]
匹配a-z或0-9
(7)轉義字符\
(8)分組()
如:(\.[0-9]{1,3}){3}
對分組匹配3次
補充:原生字符串,如:'\\bm\\w*\\b'
寫成原生字符串r'\bm\w*\b'
2.使用re模塊實現正則表達式操作
(1)匹配字符串
1)re.match
只是從頭開始匹配
re.match(pattern,string,[flags])
#pattern模式字符串
#string要進行匹配的字符串
#flags指定標誌位
#標誌位控制匹配方式:re.I:不區分字母大小寫,re.A:讓\w不匹配漢字
import re
pattern = r'qw_\w*' #模式字符串
string = 'QW_PYTHON qw_python' #要匹配的字符串
match = re.match(pattern,string,re.I) #匹配字符串
print(match)
print("起始位置:",match.start())
print("結束位置:",match.end())
print("匹配數據:",match.group())
2)re.search
匹配包含
re.search(pattern,string,[flags])
import re
pattern = r'qw_\w*' #模式字符串
string = '項目QW_PYTHON qw_python' #要匹配的字符串
match = re.search(pattern,string,re.I) #匹配字符串
print(match)
print("起始位置:",match.start())
print("結束位置:",match.end())
print("匹配數據:",match.group())
3)re.findall
把所有匹配到的字符放到以列表中的元素返回
re.findall(pattern,string,[flags])
import re
pattern = r'qw_\w*' #模式字符串
string = '項目QW_PYTHON qw_python' #要匹配的字符串
match = re.findall(pattern,string,re.I) #匹配字符串
print("匹配到字符串列表:",match)
print("匹配到的字符串:")
for item in match:
print(item)
(2)替換字符串
re.sub
匹配字符並替換
re.sub(pattern,repl,string,count,flags)
#repl用來進行替換的字符串
#count替換的最大次數,默認值0替換所有
import re
pattern = r'1[3-8]\d{9}' #模式字符串
string = '中獎號碼:888999 聯繫電話:13866666611' #要匹配的字符串
result = re.sub(pattern,"1xxxxxxxxxx",string) #替換字符串
print(result)
(3)分割字符串
re.split
以匹配到的字符當做列表分隔符
re.split(pattern,string,[maxsplit],[flags])
#maxsplit最大拆分次數
import re
pattern = r'[?|&]' #分隔符
string = "http://www.xxx.com/login.php?user='qwzf'&pwd='qwzf'" #要匹配的字符串
result = re.split(pattern,string) #分割字符串
print(result)
補充:re.fullmatch
全部匹配
六、函數
1、函數的創建和調用
#創建函數
def functionname([參數]):
'''函數說明'''
函數體
#調用函數
functionname([參數])
2、參數傳遞
1.瞭解形式參數和實際參數
值傳遞和引用傳遞
值傳遞->不可變對象->不改變形式參數的值
引用傳遞->可變對象->改變形式參數的值
2.位置參數
位置參數是必須按照定義時的個數和順序進行參數傳遞,也稱必備參數。
3.關鍵字參數
關鍵字參數是指使用形式參數的名字來確定輸入的參數值。
def functionname(p1,p2,p3):
函數體
functionname(p1=v1,p2=v2,p3=v3)
functionname(p1=v1,p3=v3,p2=v2)
4.爲參數設置默認值
def functionname(...,[參數名=默認值]):
函數體
#默認值參數必須放在所有參數的最後
如:
def functionname(p2,p3,p1=v1):
函數體
#查看默認值
print(functionname,__defaults__)
爲參數設置默認值時,參數必須指向不可變對象。遇到可變對象,參數默認值可以設置爲None。
5.可變參數
個數不固定的參數->0、1、2…n個參數
(1)*parameter
接收任意多個實參,並把它們放到元組中
也可接收列表
def coffee(*name):
print("\n咖啡有:")
for item in name:
print(item) #輸出咖啡名稱
coffee("卡布奇諾","藍山","拿鐵")
list1 = ["卡布奇諾","藍山","拿鐵"]
coffee(*list1)
(2)**parameter
接收任意多個類似關鍵字參數一樣顯式賦值的實參,並將其放到一個字典中
也可接收字典
def sign(**sign):
print()
for key,value in sign.items(): #遍歷字典
print(key,"的漢字是",value)
sign(chi='吃',kan='看')
dict1 = {'zi':'字','dian':'典'}
sign(**dict1)
3、返回值
return [value]
#不指定return或沒有value,返回None
def functionname(p1,p2,p3):
函數體
return r1,r2......
result = functionname(v1,v2,v3)
#只有一個返回值result保存的是返回值
#有多個返回值result保存的是元組
4、變量的作用域
變量的作用域是指程序代碼能夠訪問該變量的區域,如果超出該區域,再訪問時就會出現錯誤。
根據變量有效範圍:局部變量和全局變量
函數體內修改全局變量:
在函數體內定義一個全局變量,使用global
關鍵字將局部變量變成全局變量
string = "我學Python"
def demo():
global string #定義全局變量
string = "我被修改了!" #修改全局變量
print("函數內全局變量",string)
demo()
print("函數外全局變量",string)
5、匿名函數(lambda)
Python中使用lambda表達式來實現匿名函數。
result = lambda [arg1[,arg2,...,argn]]:expression
#arg1參數
#expression實現具體功能的表達式,不能出現for或while等
import math
r = 10 #半徑
result = lambda r:math.pi*r*r
print("半徑爲",r,"的圓面積爲:",result(r))
七、模塊
1、模塊概述
模塊是Python程序
模塊->*.py
把能夠實現某一特定功能的代碼放置在一個文件中作爲一個模塊,從而方便其他程序和腳本導入並使用。
使用模塊的四點好處:
(1)可以避免函數名和變量名衝突
(2)更容易查找代碼
(3)提高代碼的可重用性
(4)有選擇的使用
2、自定義模塊
模塊可包含:函數、變量、類、可執行代碼
1.創建模塊
模塊名.py->文件名
模塊名不能是Python自帶的標準模塊名稱。
#calculate.py
def add(a,b): #加法
return round(a+b,1)
#demo.py
import calculate #導入模塊
x = 0.2
y = 0.3
print(calculate.add(x,y))
2.使用import語句導入模塊
import modulename [as alias]
#alias別名
#使用as關鍵字爲模塊指定別名
#指定別名之後,可以通過別名引用模塊
import語句導入模塊->命名空間
3.使用from…import語句導入模塊
from modulename import member
#member變量、函數、類
#導入模塊全部定義,使用*
#dir()函數打印模塊的全部定義
#calculate.py
def add(a,b): #加法
return round(a+b,1)
def sub(a,b): #減法
return round(a-b,1)
def mul(a,b): #乘法
return round(a*b,1)
#demo.py
from calculate import add #導入模塊中add()函數
x = 0.2
y = 0.3
print(add(x,y))
注:導入兩個包括同名函數的模塊,使用import語句導入。
4.模塊搜索目錄
導入模塊時查找模塊的順序是:
1)先從內存中,已經存在的模塊中查找
2)內置的模塊
3)自定義模塊
4)環境變量sys.path中找
(1)臨時添加
臨時目錄只在當前執行的窗口有效
#F:\Python\temp\calculate.py
def add(a,b): #加法
return round(a+b,1)
#F:\Python\demo\demo.py
import sys #導入內置模塊
sys.path.append('F:/Python/temp') #添加臨時目錄
import calculate #導入自定義模塊
print(sys.path)
x = 0.2
y = 0.3
print(calculate.add(x,y))
(2)增加.pth文件(推薦)
只在當前Python版本有效
#F:\Python\demo\demo.py
import sys #導入內置模塊
import calculate #導入自定義模塊
print(sys.path)
x = 0.2
y = 0.3
print(calculate.add(x,y))
(3)在PYTHONPATH環境變量中添加
在多個Python版本有效
3、以主程序的形式執行
由於Python沒有統一的程序入口,從第一行開始執行。會出現一些問題。解決方法:以主程序的形式執行
if __name__ == '__main__'
#__name__記錄模塊名稱的變量。
#當程序在頂級模塊運行時,返回的值就是__main__;被導入其他文件時,返回的值是模塊名稱
#calculate.py
str1 = "我學Python"
def string():
str2 = "沒有什麼不可能"
return str2
print("__name__運行測試:",__name__)
if __name__ == '__main__':
print("以主程序的形式執行")
print(str1)
#main.py
import calculate #導入模塊
print("導入模塊後輸出:",calculate.str1)
4、Python中的包
包->文件夾->__init__.py
規範代碼
模塊:避免函數名和變量名重名引發的衝突
包:避免模塊名重名引發的衝突
1.Python程序的包結構
文件夾下包含__init__.py
,則這個文件夾就是個包
2.創建和使用包
(1)創建包
1)創建文件夾
2)在文件夾下,創建__init__.py
3)在文件夾下,創建模塊
(2)使用包
1)import + 完整包名 + 模塊名
如:
import settings.size
print(settings.size.width)
2)from + 完整包名 + import + 模塊名
如:
from settings import size
print(size.width)
3)from + 完整包名 + .模塊名 + import + 定義名
如:
from settings.size import width
print(width)
5、引用其他模塊
1.標準模塊
標準模塊可查看官方說明文檔:python37/Doc/python373.chm:The Python Standard Library
中文版參考:Python3.x標準模塊庫目錄
2.第三方模塊的下載與安裝
(1)下載網站:
https://pypi.org/
http://pypi.python.org/pypi
(2)pip
pip <command> [modulename]
#command包括:install、uninstall、list
#install安裝第三方模塊
#uninstall卸載第三方模塊
#list顯示已經安裝的第三方模塊
導入模塊順序:標準模塊->第三方模塊->自定義模塊
常用pip命令:
1)不同Python版本使用pip:
python3 -m pip <command> [modulename]
2)pip源臨時更換到國內鏡像:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple [modulename]
將pip源更換到國內鏡像
(3)通過setup.py
安裝
打開cmd 到達安裝目錄
python setup.py build
python setup.py install
後記
學習完字符串及正則表達式、函數、模塊後,掌握了字符串的操作、正則表達式模式串的編寫、函數相關知識和模塊的使用。繼續學習@_@