目录
基础知识
基础语法
基本语法总汇
新建脚本文件时需要在文件的头部进行如下声明:
多行语句
- 说明:python语句中一般以行作为语句的结束符,但是我们可以使用斜杠(\)将一行的语句分为多行显示,如下所示:
语句中包含{},[]或()就不需要使用多行连接符。
Python引号 Python 使用单引号(’),双引号(”),三引号(’’’ “”“)来表示字符串,引号的开始与结束必须是相同的类型。其中三引号可以由多行组成。
- python中单行注释采用#开头
- python中多行注释使用三个单引号或是三个多引号。
数据类型
- python 支持五个标准数据类型:
- Numbers(数字)
- String(字符串)
- List(列表)
- Tuple(元组)
- Dictionary
- python支持四种不同的数据类型:
- int(有符号)
-
数学操作符
- ** :指数:2**3 = 8
- %:取模/取余数 22%8 = 6
- //: 取整 22//8 = 2
- / : 除法 22/8 = 2.75
- *: 乘法
- ’-‘:减法
- ’+’:加法
# !/usr/bin/python
**当有中文时,应加入**
# -*- coding: UTF-8 -*-
基本操作
- 常用操作符
- 通过+可以连接两个字符串
- ‘’表示乘法,但“”操作符用于一个字符串和一个整数时,它变成了“字符串复制”操作符。他将原来的字符串复制若干次,次数就是整型的值。
-
python的变量名是区分大小写的
-
字符转换为整形 int(“char”)
-
其他转换为string类型:str(int(“字符”))
-
变量名是区分大小写的
-
常用函数
-
print()函数:输出
-
input()函数:输入
-
len()函数:获得字符串长度
-
控制流
- 布尔数据类型只有两种值:True和False。首字母必须大写。
- not操作符只作用于一个布尔值(或表达式)。not操作符求值为相反的布尔值。
- 通过代码行的缩进来控制代码块的开始和结束。
- 代码块有3条规则:
- 缩进增加时,代码块开始;
- 代码块可以包含其他代码块;
- 缩进减少为零,或减少为外面包围代码块的缩进,代码块结束
- 条件语句:
- if语句包含以下部分:
- if 关键字
- 条件
- 冒号(:)
- 在下一行开始,缩进的代码块
- elif语句包含以下部分
- elif关键字
- 条件
- 冒号(:)
- 在下一行开始,缩进的代码块
- else语句包含以下部分:
- else关键字
- 冒号
- 在下一行开始,缩进的代码块
- if语句包含以下部分:
- while 循环语句:
- 格式while 条件 冒号(:)
- while循环中的break语句用来跳出循环
- while循环中的continue用来调整本次循环,进入下一个循环
- for循环语句包含以下部分
- for关键字
- 一个变量名
- in关键字
- 调用range()方法,最多传入3个参数
- 冒号(:)
- 从下一行开始,缩退的代码块
- range()函数开始、停止和步长参数
-
三个参数用逗号(,)分割
-
第一个参数省略表示用0开始
-
第三个参数省略表示步长为1
-
可是使用负数为步长,让循环计数逐渐减少
for i in range(5, -1, -1):
print(i)
导入模块
在开始使用一个模块中的函数之前,必须使用import语句导入该模块 import语句包含以下部分:
- import 关键字
- 模块的名称
- 可选的更多的模块名称,之间用逗号(,)隔开
import random, sys
用sys.exit()提前结束程序
函数
定义
def hello(name)
return
说明:
- 使用def定义函数,def 后面跟函数名称
- 函数名括号内为函数参数
- 使用return 作为返回值
- global 语句:如果需要在一个函数内修改全局变量,就使用global语句
def spam():
global eggs
eggs = 'spam'
eggs = 'global'
spam()
print(eggs)
-
异常处理 try excepty
try: i = i/i except ZeroDivisionError: print('error')
列表
定义
-
列表是一个值,它包含多个字构成的序列。
-
用下标取得列表中的单个值,
-
如果使用下标超出了列表中值的个数,python将给出
IndexError
出错信息 -
负数下标:整数值-1指的是列表中的最后一个下标,-2 是列表中倒数第二个下标
-
利用切片获得子列表
- spam[2]:是一个列表和下标
- spam[1:4]:是一个列表和切片,在一个切片中,第一个整数是切片开始处的下标,第二个整数是切片结束处的下标,切片向上增长,直至第二个下标,但不包括它
-
使用len获得列表的长度,返回列表中值的个数
-
使用下标改变列表中的值
-
使用
+
操作符连接两个列表 -
使用del语句从列表中删除值:del语句将删除列表中下标处的值
-
使用in 和not in 操作符,可以确定一个值是否在列表中
spam = ['cat', 'bat', 'rat', 'elephant'] #切片获得子列表 spam[1:4] #获得列表的个数 len(spam) #改变列表的值 spam[0] = 'aba' #连接两个列表 ani = ['cay', 'wo'] spam = spam + ani #添加列表demo catNames = [] while True: name = input() if name == '': break catNames = catNames + [name] #list concatenation # 多重赋值:变量长度和列表的长度必须严格相等 cat = ['fat', 'black', 'loud'] size, color, disposition = cat
常用方法
- 用index()方法在列表中查找值:可以传入一个值,如果该值存在于列表中,就返回它的下标,如果该值不在列表中,Python就报ValueError。
- 使用append()和insert()方法在列表中添加值:调用append方法,将参数添加到列表尾部,insert方法可以在列表中任意下标中插入一个值,insert方法的第一个参数是新值的下标,第二个参数是要插入的值。
- 使用remove()方法从列表中删除值:给remove()方法传入一个值,它将从被调用的列表中删除;如果试图删除列表中不存在的值,将导致ValueError错误,如果该值在列表中出现多次,只有第一次出现的值会被删除。
- 用sort()方法将列表中的值排序:也可以指定reverse关键字参数为True让sort()按逆序排序。
apam = ['cat', 'dog', 'bat']
spam.insert(1, 'chicken')
spam.append('moose')
spam.remove('cat') #删除cat
sort()方法注意事项:
- sort() 没有返回值,直接排序使用
- 不能对既有数字又有字符串的列表进行排序
- sort()方法对字符串排序时,使用‘ASCII字符顺序’,而不是实际的字典顺序。如果需要使用字典顺序,则设置关键字参数key 设置为str.lower
spam.sort()
spam.sort(reverse=True) #逆序排序
apam = ['a', 'z', 'A', 'Z']
spam.sort()
spam.sort(key=str.lower) #使用字典顺序排序
元组
- 元组用圆括号()表示
- 元组像字符串一样,是不可变的
- 如果元组中只有一个值,后面要跟上一个逗号
- 使用tuple()函数可以把列表装换成元组,使用list()函数可以把元组转换成列表
tuple(['cat', 'dog', 5])
list(('cat', 'dog', 5))
引用
- 列表使用的是引用方式
- 列变作为函数的参数也是引用的方式
- 如果不想使用引用,就使用copy模块提供的copy()和deepcopy()函数
字典
-
字典使用大括号
-
字典的键值可以是字符也可以是数字
-
尝试访问字典中不存在的键,将导致 KeyError 出错信息,可以使用关键字in来判断key是否是字典的键值。
-
字典有3个方法,分别是keys(),values(), items()。分别对应于字典的键、值和键值对。这些方法返回的值不是真正的列表,它们不能被修改。注意:items 返回的是一个包含键和值的元组。
-
使用字典的get()方法,他有两个参数:要取的其值的键,以及如果改键不存在时,返回的备用值。
-
setdefault() 方法提供了一种方式,在一行中完成这件事。传递给该方法的第一个参数,是要检查的键。第二个参数,是如果该键不存在时要设置的值。如果该键确实存在,方法就会返回键的值。
picnicItems = {'apples':5, 'cups':2} picnicItems.get('cups',0)
字符串
-
字符串可以使用双引号开始和结束,就像用单引号一样。使用双引号的一个好处,就是字符中可以使用单引号字符。
-
转义字符(\)
-
原始字符串:可以在字符串开始的引号之前加上r,使它成为原始字符串。“原始字符串”完全忽略所有的转义字符,打印出字符串中所有的倒斜杠。
-
用三重引号实现多行字符串:多行字符串的起止是3个单引号或3个双引号。三重引号 之间的所有引号、制表符或换行,都被认为是字符串的一部分。
-
‘#’ 号实现一行注释,“”“ 多行注释 ”“”
-
字符串的in和not in操作符:用来判断字符串是否在另一个字符串中。
-
upper(), lower():字符串方法返回一个新的字符串,其中原字符串的所有字母都被相应地转换为大写或是小写。字符串中非字母字符保持不变。
-
isupper() 和 islower()方法:字符串中至少有一个字母,并且所有字母都是大写或小写。isupper()和islower()方法就会相应地返回布尔值True。
isalpha()返回 True,如果字符串只包含字母,并且非空;
isalnum()返回 True,如果字符串只包含字母和数字,并且非空;
isdecimal()返回 True,如果字符串只包含数字字符,并且非空;
isspace()返回 True,如果字符串只包含空格、制表符和换行,并且非空;
istitle()返回 True,如果字符串仅包含以大写字母开头、后面都是小写字母的单词
- startswith()和endswith():如果他们所调用的字符串是以该方法传入的字符串开始或是结束。就返回True。否则返回False。
- join()函数:将一个字符串列表连接起来。参数是一个字符串列表。用调用的字符串分割。
- split()函数:使用函数的参数对字符串进行分割,并返回字符串列表
span = ','.join(['cats', 'rats', 'bats'])
"cats, rats, bats"
list = span.split(',')
['cats', 'rats', 'bats']
- rjust() 和ljust():右对齐和左对齐。这两个方法的第一个参数是一个整数长度,第二个参数是指定一个填充字符,默认是空格。
- center()是让文本居中。
'Hello'.rjust(10) #将'Hello'放在一个长度为 10 的字符串中。 'Hello'有 5 个字符,所以左边会加上 5 个空格,得到一个 10 个字符的字符串,实现 'Hello'右对齐
-
用strip()、rstrip()和 lstrip()分别为删除左边和右边的空白字符、删除右边空白字符、删除左边字符。
-
使用pyperclip模块拷贝粘贴字符串:通过其函数copy()和paste()函数,可以向计算机的剪贴板发送文本,或是从它接收文本。
-
pyperclip 模块不是 Python 自带的。要安装它。
正则表达式
正则表达式简称‘regex’,如果在python中需要使用正则表达式需要导入re模块。
向re.compile()传入一个字符串,表示正则表达式,它将返回一个regex模式对象。regex对象的search()方法查找传入的字符串,寻找该正则表达式的所有匹配。如果字符串中没有找到该正则表达式,search()方法将返回none。如果找到了该模式,search方法将返回一个match对象。match对象有一个group()方法,它返回被查找字符串中实际匹配的文本。
phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d')
mo = phoneNumRegex.search('my number is 415-555-4242')
print('Phone number found: ' + mo.group())
打印出来:415-555-4242
利用括号分组
假如想将区号从电话号码中分离。添加括号将在正则表达式中创建’分组’ (\d\d\d)-(\d\d\d-\d\d\d\d)
。然后可以使用group()匹配对象方法,从一个分组中获取匹配的文本。
正则表达式字符串中的第一对括号是第1组。第二对括号是第2组。向group()匹配对象方法传入整数1或2,就可以得到匹配文本的不同部分。向group()方法传入0或是不传入参数,将返回整个匹配的文本。
如果想获得所有的分组,请使用groups()方法。
phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d-\d\d\d\d)')
mo = phoneNumRegex.search('my number is 415-555-4242')
mo.group(1)
'415'
mo.group(2)
'555-4242'
mo.group(0)
'415-555-4242'
mo.group()
'415-555-4242'
mo.groups()
('415','555-4242')
areaCode, mainNumber = mo.groups()
print(areaCode)
415
print(mainNumber)
555-4242
括号在正则表达式中有特殊的含义,但是如果你需要在文本中匹配括号,就需要用倒斜杠对进行字符转义。
用管道匹配多个分组
字符** | **称为”管道“。希望匹配许多表达式中的一个时。就可以使用它。将找到第一次出现的匹配文本。 |
可以利用findall()方法,找到”所有“匹配的地方。
基本语法
-
‘\d’:表示一位数字
-
用问号?实现可选匹配:字符?表明它前面的分组在这个模式中是可选择的
batRegex = re.compile(r'Bat(wo)?man') mo1 = batRegex.search('The Adventures of Batman') >>> mo1.group() 'Batman' mo2 = batRegex.search('The Adventures of Batwoman') >>> mo2.group() 'Batwoman'
-
用星号匹配零次或多次:* 意味着”匹配零次或多次“,及星号之前的分组,可以在文本中出现任意次。它可以完全不存在,或一次又一次的重复。
>>> batRegex = re.compile(r'Bat(wo)*man')
>>> mo1 = batRegex.search('The Adventuresof Batman')
>>> mo1.group()
'Batman'
>>> mo2 = batRegex.search('The Adventures of Batwoman')
>>> mo2.group()
'Batwoman'
>>> mo3 = batRegex.search('The Adventures of Batwowowowoman')
>>> mo3.group()
'Batwowowowoman'
- 用加号匹配一次或多次:加号前面的分组必须”至少出现一次“。
- 用花括号匹配特定的次数:
(Ha){3}
:匹配HaHaHa,(Ha){3,5}
:指定范围为一个最小值一个最大值,将匹配重复3次、4次、5次的。
贪心和非贪心匹配
Python的正则表达式默认是”贪心“的,这表示在有二义的情况下,它们会尽可能匹配最长的字符串。花括号的”非贪心”版本匹配尽可能最短的字符串,及在结束的花括号后跟着一个问号。
>>> greedyHaRegex = re.compile(r'(Ha){3,5}') >>> mo1 = greedyHaRegex.search('HaHaHaHaHa') >>> mo1.group()
'HaHaHaHaHa'
>>> nongreedyHaRegex = re.compile(r'(Ha){3,5}?') >>> mo2 = nongreedyHaRegex.search('HaHaHaHaHa') >>> mo2.group()
'HaHaHa'
findall方法
如果正则表达式中没有分组,findall返回一个字符串列表。如果正则表达式中有分组,findall将返回元组列表
# 无分组
>>> phoneNumRegex = re.compile(r'\d\d\d-\d\d\d-\d\d\d\d') # has no groups >>> phoneNumRegex.findall('Cell: 415-555-9999 Work: 212-555-0000') ['415-555-9999', '212-555-0000']
# 有分组
>>> phoneNumRegex = re.compile(r'(\d\d\d)-(\d\d\d)-(\d\d\d\d)') # has groups >>> phoneNumRegex.findall('Cell: 415-555-9999 Work: 212-555-0000')
[('415', '555', '1122'), ('212', '555', '0000')]
字符分类
- \d :0到9的任何数字
- \D:除0到9的数字以外的任何字符
- \w:任何字母、数字或下划线(可以认为是匹配”单词“字符)
- \s:空格、制表符或换行符(可以认为是匹配”空白“字符)
- \S:除空格制表符和换行符以外的任何字符
建立自己的字符分类
使用方括号建立自己的字符分类,可以使用方括号定义自己的字符分类。例如,字符分类[aeiouAEIOU]将匹配所有的元音字符,不论大小写。也可以使用短横表示字母或数字的范围。例如:[a-zA-Z0-9]将匹配所有小写字母、大写字母和数字。在方括号内,普通的正则表达式符号不会被解释。
通过在字符分类的左边括号后加上一个插入字符(^),就可以得到“非字符类”。非字符类将匹配不在这个字符类中的所有字符。
插入字符和美元字符
-
可以在正则表达式的开始处使用插入符号(^),表明匹配必须发生在被查找文本开始处。
-
可以在正则表达式的末尾加上美元符号($),表示该字符串必须以这个正则表达式的模式结束.
r'^Hello' # 匹配以‘Hello’ 开始的字符串。 r'\d$' #匹配以数字0到9结束的字符串 r'^\d+$' #匹配从开始到结束都是数字的字符串
通配符
在正则表达式中,.(句点)字符称为“通配符”。它匹配除了换行之外的所有字符。
注意:句点字符只匹配一个字符。
用点星(.*)
匹配所有的字符
点-星使用“贪心”模式:它总是匹配尽可能多的文本。要用“非贪心“模式匹配所有文本,就使用点-星和问号。(r'.*?')
用句点字符匹配换行
点-星将匹配除换行外的所有字符。通过传入re.DOTALL
作为 re.compile()
的第二个参数,可以让句点字符匹配所有字符,包括换行字符。
newlineRegex = re.compile('.*', re.DOTALL)
正则表达式符号复习
- ?匹配零次或一次前面的分组。
- *匹配零次或多次前面的分组。
- +匹配一次或多次前面的分组。
- {n}匹配 n 次前面的分组。
- {n,}匹配 n 次或更多前面的分组。
- {,m}匹配零次到 m 次前面的分组。
- {n,m}匹配至少 n 次、至多 m 次前面的分组。
- {n,m}?或*?或+?对前面的分组进行非贪心匹配。
- ^spam 意味着字符串必须以 spam 开始。
- spam$意味着字符串必须以 spam 结束。
- .匹配所有字符,换行符除外。
- \d、\w 和\s 分别匹配数字、单词和空格。
- \D、\W 和\S 分别匹配出数字、单词和空格外的所有字符。
- [abc]匹配方括号内的任意字符(诸如 a、b 或 c)。
- [^abc]匹配不在方括号内的任意字符。
不区分大小写的匹配
通常,正则表达式用你指定的大小写匹配文本。可以通过向re.compile()传入re.IGNORECASE 或 re.I,
作为第二个参数。
>>> robocop = re.compile(r'robocop', re.I)
>>> robocop.search('RoboCop is part man, part machine, all cop.').group()
>>>'RoboCop'
>>> robocop.search('ROBOCOP protects the innocent.').group() >>>ROBOCOP'
>>> robocop.search('Al, why does your programming book talk about robocop so much?').group()
>>>'robocop'
用sub()方法替换字符串
可以使用sub()方法替换字符串,regex对象的sub()方法需要传入两个参数。第一个参数是一个字符串,用于取代发现的匹配。第二个参数是一个字符串,即正则表达式。sub()方法返回替换完成后的字符串。
>>> namesRegex = re.compile(r'Agent \w+')
>>> namesRegex.sub('CENSORED', 'Agent Alice gave the secret documents to Agent Bob.') 'CENSORED gave the secret documents to CENSORED.'
有时候,你可能需要使用匹配的文本本身,作为替换的一部分。在sub()的第一个参数中,可以输入\1、\2、\3…..。表示”在替换中输入分组1、2、3“的文本。
例如:假如想要隐去密探的姓名,只显示他们姓名的第一个字母。要做到这一点,可以使用正则表达式Agent(\w)\w*,传入r’\1’作为sub()的第一个参数。字符串中的\1将有分组1匹配的文本所代替,也就是正则表达式的(\w)分组。
>>> agentNamesRegex = re.compile(r'Agent (\w)\w*')
>>> agentNamesRegex.sub(r'\1****', 'Agent Alice told Agent Carol that Agent Eve knew Agent Bob was a double agent.')
A**** told C**** that E**** knew B**** was a double agent.'
管理复杂的正则表达式
通过向re.compile()传入变量re.VERBOSE,作为第二个参数。用来忽略正则表达式字符串中的空白符合注释。
组合使用re.IGNORECASE re.DOTALL 和re.VERBOSE
如果你希望在正则表达式中使用re.verbose 来编写注释,还希望使用re.ignorecase 来忽略大小写,可以使用管道字符( | )将变量组合起来。 |
常用函数汇总
- print()函数将括号内的字符串显示在屏幕上。
- input()函数等待用户在键盘上输入一些文本,并按下回车键
- len()函数传递一个字符串,然后使用该函数获得该字符的个数
- str()函数可以传入一个整型值,并求值为它的字符串形式
- int()函数把传入的字符串转换为整型
- float()函数把传入的字符串转换为浮点数的形式