0.下载安装
下载地址:Download Python | Python.org
PyCharm:Download PyCharm: The Python IDE for data science and web development by JetBrains
1.基础
1.1 交互式环境中输入表达式
1.2 数据类型
- 整数型
- 浮点型
- 字符型
- 布尔型
数字之间的运算符:
字符串拼接 用 +
joinValue = "hello" + "world"
字符串复制 用 *
doubleValue = "test" * 8
字符串和数字不能直接相连,比如这种是不允许的:
"test" + 5
字符与数字之间互相转换需要使用 str()、int()、float()函数
if __name__ == '__main__':
age = 34
ageDesc = str(age)
ageInt = float(ageDesc)
print(age)
print(ageDesc)
print(ageInt)
1.3 变量 & 赋值
变量名只能使用:数字、字符 、下划线
声明变量时无需声明类型
赋值使用 =
1.4 print() 、input() 输出 、 输入
input()接收的是字符串
1.5 demo
if __name__ == '__main__':
# 年龄23 age = 34
ageDesc = str(age)
ageInt = float(ageDesc)
print(age)
print(ageDesc)
print(ageInt)
print(ageInt == age)
2.控制流
2.1比较运算符
- ==
- !=
- <
- >
- <=
- >=
与、或、非: and 、 or、not
if age == 18 and name == 'ming':
print('young')
if not age == 18 or name == 'xiao':
print('old')
2.2 if语句
if __name__ == '__main__':
# 简单if判断
if 5 >= 3:
print("True")
# 完整if else 判断
score = 80
if score >= 80:
print("good")
elif score >= 60:
print("normal")
else: print("bad")
2.3while语句
if __name__ == '__main__':
# while判断
num = 0
name = 'ming'
while num < 100:
num = num + 1
if num % 5 == 0:
continue
if num == 88 and name == 'ming':
break print(num)
2.4 for语句
if __name__ == '__main__':
# for循环:默认从0开始,不包含10
for i in range(10):
print(i)
# for循环:限定从3开始
for i in range(3, 10):
print(i)
# for循环:从1开始,步长为2
for i in range(1, 10, 2):
if i % 5 == 0: continue print(i)
2.5 import的两种写法:
直接import,调用时需要声明模块
import random
if __name__ == '__main__':
rand = random.randint(1, 10)
print(rand)
调用时无需声明模块
from random import *
if __name__ == '__main__':
rand = randint(1, 10)
print(rand)
3.函数
3.1 如何定义函数
使用def关键字
# 无入参、无出参
def say_hello():
print("hello")
# 有入参、无出参
def say_hello2(name):
print("hello, " + name)
# 有入参、有出参
def add(num1, num2):
return num1 + num2
# 出参为空
def add2(num1, num2):
return None
if __name__ == '__main__':
say_hello()
say_hello2("test")
print(add(1, 2))
print(add2(1, 2))
函数关键字
先看下print()函数,预留了sep和end两个关键字,作为拼接符和行尾符
if __name__ == '__main__':
print('test', 'test1', sep=',', end=' (end)')
输出:
3.2 全局变量和局部变量
局部方法中可以使用全局变量,但一定要用global关键字修饰,否则会被认为是局部变量
name = 'global name'
def test_global():
global name
name = 'inner name'
print(name)
if __name__ == '__main__':
print(name)
test_global()
print(name)
3.3 异常捕获
try ... except ..
def division(num1, num2):
try:
return num1 / num2
except ZeroDivisionError:
print("error occur")
return None
if __name__ == '__main__':
print(division(10, 2))
print(division(10, 5))
print(division(10, 0))
print(division(10, 1))
4.列表
4.1 列表
列表是一组数据的集合,结构为:[]
看下列表基本的操作:
1.定义列表 & 打印
if __name__ == '__main__':
# 定义一个list
myList = ['apple', 'banana', 'pear']
# 打印输出
print(myList)
# 遍历打印
for i in myList:
print(i)
2.增删改查
if __name__ == '__main__':
# 定义一个list
myList = ['apple', 'banana', 'pear']
# 获取长度
length = len(myList)
print(length)
# 获取其中一个元素
print(myList[2])
print(myList[-1])
# 查找其中一个元素位置
# apple不存在时会报错
index = myList.index('apple')
print(index)
# 增加一个元素
myList.append('orange')
# 增加一个元素 指定位置
myList.insert(0, 'peach')
# 修改一个元素
myList[1] = myList[0]
myList[0] = 'apple'
print(myList)
# 删除一个元素 通过索引
del myList[0]
print(myList)
# 删除一个元素 通过值
# peach不存在时会报错
myList.remove('peach')
print(myList)
3.列表的拼接与复制
if __name__ == '__main__':
# 定义一个list
myList = ['apple', 'banana', 'pear']
# 拼接list
myList = myList + myList
print(myList)
# 复制list
myList = myList * 2
print(myList)
4.列表的切片(子列表)
if __name__ == '__main__':
# 定义一个list
myList = ['apple', 'banana', 'pear']
subList = myList[2:4]
print(subList)
4.2元组
元组也是一组集合,但它的元素不可以更改,结构为: ()
看个Demo
if __name__ == '__main__':
myTuple = ('apple', 'banana', 'pear')
print(myTuple[0])
print(myTuple)
4.3 列表和元组转换
通过list()和tuple()函数可以进行转换
if __name__ == '__main__':
myTuple = tuple(['apple', 'banana', 'pear', 'orange'])
myList = list(myTuple)
print(myTuple)
5 字典
5.1 定义
使用{}定义一个字典项
if __name__ == '__main__':
myMap = {
'name': 'xiang',
'age': 23,
'job': 'software engineer'
}
print(myMap)
5.2 获取和赋值
普通赋值获取
但获取dict[key] 时若该键值不存在会报错
if __name__ == '__main__':
myMap = {
'name': 'xiang',
'age': 23,
'job': 'software engineer'
}
myMap['salary'] = 20000
print(myMap['salary'])
获取:dict.get(key, defaultValue) 当key不存在时不报错,并返回一个默认值 .(同Java中Map.getOrDefault(key, defaultValue))
if __name__ == '__main__':
myMap = {
'name': 'xiang',
'age': 23,
'job': 'software engineer'
}
salary = myMap.get('salary', 20000)
print('salary: ' + str(salary))
赋值:dict.setdefault(key, value)当key不存在时才赋值. Java map.setIfAbsent(key, value)
if __name__ == '__main__':
myMap = {
'name': 'xiang',
'age': 23,
'job': 'software engineer'
}
myMap.setdefault('salary', 30000)
print(myMap)
5.3 keys(), values(), items()
获取键列表、值列表、元素列表
if __name__ == '__main__':
myMap = {
'name': 'xiang',
'age': 23,
'job': 'software engineer'
}
# 获取键列表
myKeys = myMap.keys()
print("keys: ")
print(myKeys)
# 获取值列表
values = myMap.values()
print("values: ")
print(values)
# 获取元素列表
items = myMap.items()
print('items: ')
print(items)
for k, v in items:
print(str(k) + '->' + str(v))
6 字符串常用方法
6.1 普通定义
if __name__ == '__main__':
str1 = 'hello'
print(str1)
# 双引号
str2 = "hello"
print(str2)
6.2 转义符
if __name__ == '__main__':
# 转义符
str3 = "this is Joe's Dog"
str4 = "this is Joe\"s Dog"
print(str3)
print(str4)
6.3 三重引号
if __name__ == '__main__':
# 三重引号
'''
听说这个适合做注释
'''
str5 = '''
三重引号里我想输入啥就输入啥:
前提是不能再输给三重引号
苏打粉''、s、' \s \str5
'''
print(str5)
6.4 字符串下标和切片
if __name__ == '__main__':
# 字符串下标和切片
str6 = 'Hello world'
str7 = str6[0:5]
print(str7)
6.5 in 和 not in
if __name__ == '__main__':
str8 = 'hello world'
judge = 'hello' in str8
print(judge)
judge = 'Hello' not in str8
print(judge)
6.6 大小写转换
if __name__ == '__main__':
# upper() lower() isupper() islower()
str9 = 'hello world'
str10 = str9.upper()
print(str10)
print(str10.isupper())
6.7 常用的几个isX方法
if __name__ == '__main__':
str11 = 'abc'
str12 = '123'
print(str11.isalpha())
print(str11.isspace())
print(str12.isdigit())
print(str12.isnumeric())
6.8 是否以某个字段开始、结束
if __name__ == '__main__':
# startWith() endWith()
str13 = 'hello world'
print(str13.startswith('hello'))
print(str13.endswith('world'))
6.9 拼接和分割
if __name__ == '__main__':
# join() split()
str14 = ','.join(['a', 'b', 'c'])
print(str14)
myList = str14.split(',')
print(myList)
6.10 字符串调整
if __name__ == '__main__':
# rjust()、ljust() center()
str15 = 'hello'
str16 = str15.ljust(15, '*')
str17 = str15.rjust(15, '*')
str18 = str15.center(15, '*')
print(str16)
print(str17)
print(str18)
6.11 移除空白字符
if __name__ == '__main__':
# strip() lstrip() rstrip()
str19 = ' hello '
str20 = str19.lstrip()
str21 = str19.rstrip()
str22 = str19.strip()
print(str20)
print(str21)
print(str22)
6.12 同剪切板交互
要先安装第三方模块:确保pip工具已安装,则可直接通过pip工具安装
进入pip目录
/Library/Frameworks/Python.framework/Versions/3.9/bin
输入命令等待安装即可:
pip install module
安装成功:
安装第三方模块成功后,即可引用啦
import pyperclip
if __name__ == '__main__':
# pyperclip() 复制粘贴至系统剪切板
pyperclip.copy("myName is Joe")
name = pyperclip.paste()
print(name)
7.正则表达式
7.1 创建正则表达式
import re
if __name__ == '__main__':
# 创建regex
regex = re.compile(r'\d')
# 查询匹配 search返回第一条匹配的结果
match = regex.search("23 jsa")
# 打印结果
print(match.group())
7.2 使用小括号()分组
import re if __name__ == '__main__':
regex2 = re.compile(r'(\d\d\d)-(\d\d\d\d)')
match2 = regex2.search('333-4444- 333-6666')
print(match2.group(0))
7.3 使用管道符|匹配多个分组
import re if __name__ == '__main__':
# 使用管道符|匹配多个分组
regex3 = re.compile(r'Man|Woman')
match3 = regex3.search('Wo are Man')
print(match3.group())
7.4 使用问号? 匹配零次或一次
import re if __name__ == '__main__':
# 使用 ? 表示可选匹配 零次或一次
regex4 = re.compile(r'bat(wo)?man')
match4 = regex4.search('who is batwoman')
print(match4.group())
7.5 使用星号* 匹配零次或多次
import re if __name__ == '__main__':
regex5 = re.compile(r'\d*')
match5 = regex5.search('245251 sdf ')
print(match5.group())
7.6 使用加号 + 匹配一次或多次
import re if __name__ == '__main__':
# 使用 + 号匹配一次或多次
regex6 = re.compile(r'\w+')
match6 = regex6.search('sfa 24')
print(match6.group())
7.7 使用大括号{}匹配限定次数
import re if __name__ == '__main__':
# 使用{} 匹配限定次数
regex7 = re.compile(r'\w{5}')
match7 = regex7.search('software soft 24')
print(match7.group())
regex8 = re.compile(r'\w{5,8}')
match8 = regex8.search('software soft 24')
print(match8.group())
7.8 贪心匹配和非贪心匹配
默认是贪心匹配,添加?表示非贪心匹配
import re
if __name__ == '__main__':
regex9 = re.compile(r'\w{5,8}?')
match9 = regex9.search('software soft 24')
print(match9.group())
7.9 findall方法
findall返回一个列表,包含所有被匹配的项
import re
if __name__ == '__main__':
# findall方法
regex10 = re.compile(r'\w{5,8}')
list10 = regex10.findall('software television 24')
print(list10)
7.10 字符分类
- \d 数字
- \w 字符
- \s 空格
- \D 非数字
- \W 非字符
- \S 非空格
import re
if __name__ == '__main__':
# 字符分类
regex11 = re.compile(r'\d\w\s\D\W\S')
match11 = regex11.search('4l w 2')
print(match11.group())
7.11 使用[]建立自己的字符分类
import re
if __name__ == '__main__':
# 建立自己的字符分类
regex12 = re.compile(r'[0-9a-zA-Z]*')
match12 = regex12.search('test2353765dt ,kji')
print(match12.group())
7.12 插入字符^ 和 美元字符$ 限定起始字符和中止字符
import re
if __name__ == '__main__':
# 插入字符和美元字符
regex13 = re.compile(r'^a\w*')
match13 = regex13.search('adt ,kji')
print(match13.group())
regex14 = re.compile(r'\w*i$')
match14 = regex14.search('adt ,kji')
print(match14.group())
7.13 通配字符.
import re
if __name__ == '__main__':
# 通配字符.
regex15 = re.compile(r'.{5}')
match15 = regex15.search('test2353 [][')
print(match15.group())
# 用.* 匹配所有字符
regex16 = re.compile(r'.*')
match16 = regex16.search('test2353 [][')
print(match16.group())
# 用.匹配换行
regex17 = re.compile(r'.*', re.DOTALL)
match17 = regex17.search('test2353 [][\n te')
print(match17.group())
7.14 不区分大小写的匹配
import re
if __name__ == '__main__':
regex18 = re.compile(r'test', re.IGNORECASE)
match18 = regex18.search('TEST []')
print(match18.group())
7.15 使用sub()方法替换匹配的字符
import re
if __name__ == '__main__':
# 使用sub()方法替换匹配的字符串
regex19 = re.compile(r'test', re.IGNORECASE)
replace = regex19.sub('replace', 'TEST soft')
print(replace)
8 文件操作
8.1 当前工作路径
import os
if __name__ == '__main__':
# 当前路径
# /Users/xiang/software/workspaceForOthers/pythonProject/advanced
cwd = os.getcwd()
print(cwd)
# 更换当前工作目录
os.chdir('/Users/xiang/software/workspaceForOthers')
cwd = os.getcwd()
print(cwd)
# 根据操作系统拼接路径
myPath = os.path.join('Users', 'xiang', 'software')
print(myPath)
8.2 目录操作
import os
if __name__ == '__main__':
# 创建目录
existFlag = os.path.exists('/Users/xiang/software/workspaceForOthers/addDir')
if not existFlag:
os.makedirs('/Users/xiang/software/workspaceForOthers/addDir')
# 移除目录
existFlag = os.path.exists('/Users/xiang/software/workspaceForOthers/addDir')
if existFlag:
os.removedirs('/Users/xiang/software/workspaceForOthers/addDir')
8.3 获取绝对路径和相对路径
import os
if __name__ == '__main__':
# 获取绝对路径
absPath = os.path.abspath('..')
print(absPath)
# 获取相对路径
relPath = os.path.relpath('/Users/xiang/software/workspaceForOthers/addDir/addDir2')
print(relPath)
8.4 文件相关方法
import os
if __name__ == '__main__':
# 路径拆分成目录和文件名
cwdPath = '/Users/xiang/software/workspaceForOthers'
dirName = os.path.dirname(cwdPath)
baseName = os.path.basename(cwdPath)
print('dirName: ' + dirName)
print('baseName:' + baseName)
splitList = os.path.split(cwdPath)
print('dirName: ' + dirName)
print('baseName:' + baseName) # 查看文件大小
# 查看文件夹内容
cwdPath = '/Users/xiang/software/workspaceForOthers'
dirList = os.listdir(cwdPath)
print('文件夹内容:' + str(dirList))
size = os.path.getsize(cwdPath)
print('文件大小:' + str(size))
# 校验是否是文件或文件夹
cwdPath = '/Users/xiang/software/workspaceForOthers'
isDir = os.path.isdir(cwdPath)
isFile = os.path.isfile(cwdPath)
print('是目录吗:' + str(isDir))
print('是文件吗:' + str(isFile))
8.5 文件读写
import os if __name__ == '__main__':
# 文件读 cwdFilePath = '/Users/xiang/software/workspaceForOthers/hello.c'
cwdFile = open(cwdFilePath)
fileContext = cwdFile.read()
print(fileContext)
cwdFile.close()
cwdFile2 = open(cwdFilePath)
fileLinesList = cwdFile2.readlines()
for line in fileLinesList:
print(line) cwdFile2.close()
# 文件写 writeFilePath = '/Users/xiang/software/workspaceForOthers/test.txt'
writeFile = open(writeFilePath, 'w') writeFile.write('this is test')
cwdFile.close() # 文件追加 writeFilePath = '/Users/xiang/software/workspaceForOthers/test.txt'
writeFile = open(writeFilePath, 'a')
writeFile.write('\nthis is test append')
cwdFile.close()