4

Python学习-基础篇(三)

 2 years ago
source link: https://qwzf.github.io/2020/01/19/Python%E5%AD%A6%E4%B9%A0-%E5%9F%BA%E7%A1%80%E7%AF%87(%E4%B8%89)/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

由于我现在暂时用不到面向对象程序设计,所以暂且先不学习Python的面向对象程序设计。
本篇包含:字符串及正则表达式、函数、模块

五、字符串及正则表达式

1、字符串

1.字符串常用操作

(1)拼接字符串

字符串1+字符串2 = 字符串1 字符串2
python复制代码

字符串不可以直接和数值类型相加
(2)计算字符串的长度
字符串的长度,即字符串所占字节数。
A-Za-z0-9._空格等占一个字节
中文汉字占2~4字节:UTF-8占3个;GBK(gb2312)占2个
1)计算字符串字符的个数

len(string)
#len()函数获取字符的个数,不管中文还是英文都按一个字符计算
python复制代码

2)计算字符串所占字节数

len(string.encode()) #计算UTF-8编码字符长度
len(string.encode("gbk")) #计算GBK编码字符长度
python复制代码

(3)截取字符串
字符串属于序列。所以:
1)获取字符可以使用索引

string[索引值]
python复制代码

2)截取字符串可以使用切片

string[start:end:step]
python复制代码

(4)分割、合并字符串
1)分割字符串:split()

listname = str.split(sep,maxsplit)
#sep指定分隔符,默认值是空白符,如:空格、\n、\t。
#maxsplit分隔次数,-1表示没有限制
python复制代码
>>> str1 = "你  有 多 自信,\n世界 就有 多 相信你"
>>> str1.split()
['你', '有', '多', '自信,', '世界', '就有', '多', '相信你']
>>> str1.split(" ")
['你', '', '有', '多', '自信,\n世界', '就有', '多', '相信你']
>>> str1.split(" ",5)
['你', '', '有', '多', '自信,\n世界', '就有 多 相信你']
>>> str1.split("\n")
['你  有 多 自信,', '世界 就有 多 相信你']
python复制代码
str1 = "@lemon @qwzf @未完成的歌 @chumen007"
list1 = str1.split(' ') #用空格分隔字符串
for item in list1:
    print(item[1:]) #输出好友,并去掉@
python复制代码
在这里插入图片描述
在这里插入图片描述
2)合并字符串:join()
strnew = string.join(iterable)
#string合并时的分隔符
#iterable可迭代对象
python复制代码
list1 = ["lemon","qwzf","未完成的歌","chumen007"] #好友列表
str1 = " @".join(list1) #用空格和@连接
str2 = "@" + str1
print("你要@的好友:",str2)
python复制代码
在这里插入图片描述
在这里插入图片描述
(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
python复制代码

(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要转换的项
python复制代码
>>> template = '编号:%09d\t 公司名称:%s\t 官网:http://www.%s.com' #定义模板
>>> item = (6,"百度","baidu") #要转换内容
>>> print(template%item)
编号:000000006     公司名称:百度     官网:http://www.baidu.com
python复制代码

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要转换的项
python复制代码
>>> template = '编号:{:0>9d}\t 公司名称:{:s}\t 官网:http://www.{:s}.com' #定义模板
>>> print(template.format(7,"百度","baidu"))
编号:000000007     公司名称:百度     官网:http://www.baidu.com
python复制代码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(9)String模块中的常量:
string.digits:数字0~9
string.ascii_letters:所有字母(大小写)
string.lowercase:所有小写字母
string.printable:可打印字符的字符串
string.punctuation:所有标点
string.uppercase:所有大写字母

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的字符引用
python复制代码

(2)使用decode()方法解码
bytes->str

str.decode([encoding="utf-8"][,errors="strict"])
python复制代码
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)
python复制代码
在这里插入图片描述
在这里插入图片描述

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不匹配汉字
python复制代码
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())
python复制代码
在这里插入图片描述
在这里插入图片描述
2)re.search 匹配包含
re.search(pattern,string,[flags])
python复制代码
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())
python复制代码
在这里插入图片描述
在这里插入图片描述
3)re.findall 把所有匹配到的字符放到以列表中的元素返回
re.findall(pattern,string,[flags])
python复制代码
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)
python复制代码
在这里插入图片描述
在这里插入图片描述
(2)替换字符串
re.sub 匹配字符并替换
re.sub(pattern,repl,string,count,flags)
#repl用来进行替换的字符串
#count替换的最大次数,默认值0替换所有
python复制代码
import re
pattern = r'1[3-8]\d{9}' #模式字符串
string = '中奖号码:888999 联系电话:13866666611' #要匹配的字符串
result = re.sub(pattern,"1xxxxxxxxxx",string) #替换字符串
print(result)
python复制代码
在这里插入图片描述
在这里插入图片描述
(3)分割字符串
re.split 以匹配到的字符当做列表分隔符
re.split(pattern,string,[maxsplit],[flags])
#maxsplit最大拆分次数
python复制代码
import re
pattern = r'[?|&]' #分隔符
string = "http://www.xxx.com/login.php?user='qwzf'&pwd='qwzf'" #要匹配的字符串
result = re.split(pattern,string) #分割字符串
print(result)
python复制代码
在这里插入图片描述
在这里插入图片描述
补充re.fullmatch 全部匹配

1、函数的创建和调用

#创建函数
def functionname([参数]):
    '''函数说明'''
    函数体

#调用函数
functionname([参数])
python复制代码

2、参数传递

1.了解形式参数和实际参数
值传递和引用传递
值传递->不可变对象->不改变形式参数的值
引用传递->可变对象->改变形式参数的值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.位置参数
位置参数是必须按照定义时的个数和顺序进行参数传递,也称必备参数。
3.关键字参数
关键字参数是指使用形式参数的名字来确定输入的参数值。
def functionname(p1,p2,p3):
    函数体
functionname(p1=v1,p2=v2,p3=v3)
functionname(p1=v1,p3=v3,p2=v2)
python复制代码

4.为参数设置默认值

def functionname(...,[参数名=默认值]):
    函数体
#默认值参数必须放在所有参数的最后
如:
def functionname(p2,p3,p1=v1):
    函数体

#查看默认值
print(functionname,__defaults__)
python复制代码

为参数设置默认值时,参数必须指向不可变对象。遇到可变对象,参数默认值可以设置为None。
5.可变参数
个数不固定的参数->0、1、2…n个参数
(1)*parameter
接收任意多个实参,并把它们放到元组中
也可接收列表

def coffee(*name):
    print("\n咖啡有:")
    for item in name:
        print(item) #输出咖啡名称
coffee("卡布奇诺","蓝山","拿铁")
list1 = ["卡布奇诺","蓝山","拿铁"]
coffee(*list1)
python复制代码
在这里插入图片描述
在这里插入图片描述
(2)**parameter
接收任意多个类似关键字参数一样显式赋值的实参,并将其放到一个字典中
也可接收字典
def sign(**sign):
    print()
    for key,value in sign.items(): #遍历字典
        print(key,"的汉字是",value)
sign(chi='吃',kan='看')
dict1 = {'zi':'字','dian':'典'}
sign(**dict1)
python复制代码
在这里插入图片描述
在这里插入图片描述

3、返回值

return [value]
#不指定return或没有value,返回None
python复制代码
def functionname(p1,p2,p3):
    函数体
    return r1,r2......
result = functionname(v1,v2,v3)
#只有一个返回值result保存的是返回值
#有多个返回值result保存的是元组
python复制代码

4、变量的作用域

变量的作用域是指程序代码能够访问该变量的区域,如果超出该区域,再访问时就会出现错误。
根据变量有效范围:局部变量和全局变量
函数体内修改全局变量:
在函数体内定义一个全局变量,使用global关键字将局部变量变成全局变量

string = "我学Python"
def demo():
    global string #定义全局变量
    string = "我被修改了!" #修改全局变量
    print("函数内全局变量",string)
demo()
print("函数外全局变量",string)
python复制代码
在这里插入图片描述
在这里插入图片描述

5、匿名函数(lambda)

Python中使用lambda表达式来实现匿名函数。

result = lambda [arg1[,arg2,...,argn]]:expression
#arg1参数
#expression实现具体功能的表达式,不能出现for或while等
python复制代码
import math
r = 10 #半径
result = lambda r:math.pi*r*r
print("半径为",r,"的圆面积为:",result(r))
python复制代码
在这里插入图片描述
在这里插入图片描述

1、模块概述

模块是Python程序
模块->*.py
把能够实现某一特定功能的代码放置在一个文件中作为一个模块,从而方便其他程序和脚本导入并使用。
使用模块的四点好处:
(1)可以避免函数名和变量名冲突
(2)更容易查找代码
(3)提高代码的可重用性
(4)有选择的使用

2、自定义模块

模块可包含:函数、变量、类、可执行代码
1.创建模块
模块名.py->文件名
模块名不能是Python自带的标准模块名称。

#calculate.py
def add(a,b): #加法
    return round(a+b,1)
python复制代码
#demo.py
import calculate #导入模块
x = 0.2
y = 0.3
print(calculate.add(x,y))
python复制代码
在这里插入图片描述
在这里插入图片描述
2.使用import语句导入模块
import modulename [as alias]
#alias别名
#使用as关键字为模块指定别名
#指定别名之后,可以通过别名引用模块
python复制代码

import语句导入模块->命名空间
3.使用from…import语句导入模块

from modulename import member
#member变量、函数、类
#导入模块全部定义,使用*
#dir()函数打印模块的全部定义
python复制代码
#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)
python复制代码
#demo.py
from calculate import add #导入模块中add()函数
x = 0.2
y = 0.3
print(add(x,y))
python复制代码
在这里插入图片描述
在这里插入图片描述
:导入两个包括同名函数的模块,使用import语句导入。
4.模块搜索目录
导入模块时查找模块的顺序是:
1)先从内存中,已经存在的模块中查找
2)内置的模块
3)自定义模块
4)环境变量sys.path中找
(1)临时添加
临时目录只在当前执行的窗口有效
#F:\Python\temp\calculate.py
def add(a,b): #加法
    return round(a+b,1)
python复制代码
#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))
python复制代码
在这里插入图片描述
在这里插入图片描述
(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))
python复制代码
在这里插入图片描述
在这里插入图片描述
(3)在PYTHONPATH环境变量中添加
在多个Python版本有效
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、以主程序的形式执行

由于Python没有统一的程序入口,从第一行开始执行。会出现一些问题。解决方法:以主程序的形式执行

if __name__ == '__main__'
#__name__记录模块名称的变量。
#当程序在顶级模块运行时,返回的值就是__main__;被导入其他文件时,返回的值是模块名称
python复制代码
#calculate.py
str1 = "我学Python"
def string():
    str2 = "没有什么不可能"
    return str2
print("__name__运行测试:",__name__)
if __name__ == '__main__':
    print("以主程序的形式执行")
    print(str1)
python复制代码
在这里插入图片描述
在这里插入图片描述
#main.py
import calculate #导入模块
print("导入模块后输出:",calculate.str1)
python复制代码
在这里插入图片描述
在这里插入图片描述

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)
python复制代码

2)from + 完整包名 + import + 模块名
如:

from settings import size
print(size.width)
python复制代码

3)from + 完整包名 + .模块名 + import + 定义名
如:

from settings.size import width
print(width)
python复制代码

5、引用其他模块

1.标准模块
标准模块可查看官方说明文档:python37/Doc/python373.chm:The Python Standard Library
中文版参考:Python3.x标准模块库目录
2.第三方模块的下载与安装
(1)下载网站:

https://pypi.org/
http://pypi.python.org/pypi
python复制代码

(2)pip

pip <command> [modulename]
#command包括:install、uninstall、list
#install安装第三方模块
#uninstall卸载第三方模块
#list显示已经安装的第三方模块
python复制代码

导入模块顺序:标准模块->第三方模块->自定义模块
常用pip命令:
1)不同Python版本使用pip:

python3 -m pip <command> [modulename]
python复制代码

2)pip源临时更换到国内镜像:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple [modulename]
python复制代码

将pip源更换到国内镜像
(3)通过setup.py安装

打开cmd 到达安装目录
python setup.py build
python setup.py install
python复制代码

学习完字符串及正则表达式、函数、模块后,掌握了字符串的操作、正则表达式模式串的编写、函数相关知识和模块的使用。继续学习@_@


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 [email protected]

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK