Python 基础代码
1.1 Python语言概述
Python语言特点
- 简洁方便:Python提供了强大的字符串处理库函数
- 跨平台:一次编写,到处运行
- 功能强大:动态类型、自动内存管理、大型程序支持、易于扩展、丰富的内置对象、丰富的内置工具、丰富的库工具、丰富的第三方工具
- 面向对象
- 应用广泛
Python语言主要应用领域
- 云计算
- WEB开发
- 科学计算与人工智能
- 桌面GUI
- 游戏
Python的环境与安装
- IDLE
- Anaconda
- Pycharm
- Jupyter notebook
1.2 Python基本语法
标识符
- 作用:作为变量、函数、类、模块以及其他对象的名称
- 规则:1.字母、数字、下划线组成,数字不开头,中间不能有空格;2.不能和Python内置关键字相同;3.标识符可以是中文、日文、俄文等Unicode字符集支持的字符
下示Python所有内置关键字:
import keyword
keyword.kwlist
['False',
'None',
'True',
'__peg_parser__',
'and',
'as',
'assert',
'async',
'await',
'break',
'class',
'continue',
'def',
'del',
'elif',
'else',
'except',
'finally',
'for',
'from',
'global',
'if',
'import',
'in',
'is',
'lambda',
'nonlocal',
'not',
'or',
'pass',
'raise',
'return',
'try',
'while',
'with',
'yield']
Python编码
- Python3默认源文件以UTF-8编码,所有字符串以unicode编码
- 采用非默认编码需要在文件的第一行添加一个特殊的注释行,如下:
#_*_coding=enconding_*_
#其中encoding 是Python支持的有效编码方式之一
Python 关键字
- 关键字即保留字,不能作为任何标识符的名称
- Python标准库提供一个keyword模块,可以输出当前版本所有关键字
import keyword
keyword.kwlist
['False',
'None',
'True',
'__peg_parser__',
'and',
'as',
'assert',
'async',
'await',
'break',
'class',
'continue',
'def',
'del',
'elif',
'else',
'except',
'finally',
'for',
'from',
'global',
'if',
'import',
'in',
'is',
'lambda',
'nonlocal',
'not',
'or',
'pass',
'raise',
'return',
'try',
'while',
'with',
'yield']
注释
- 单行注释:以 # 开头
- 多行注释:;''' '''
连续行
- 使用反斜杠连续,当语句中包含[],{},()就不需要连续符
空行
- 空行分割两段不同功能或含义的代码,便于日后维护或重构
缩进
- Python中代码块层次关系是通过缩进来体现的
- 首行无缩进
- 使用' : '开始一个新的逻辑层
字面值
- 数值字面值:整数、浮点数、虚数
- 字符串字面值:‘a’,'abc','123'
常量
- Python常量名只能由大写字母和下划线构成
- 常量定义完成后不能再修改它的内容
- Python内置常量有True、False、Notlmplemented、Ellipsis、debug
True=0
File "C:\Users\ADMINI~1\AppData\Local\Temp/ipykernel_10928/1874625572.py", line 1
True=0
^
SyntaxError: cannot assign to True
变量
- Python变量不需要声明就可以直接赋值,变量的数据类型可以随时改变
- Python中,允许多个变量指向同一个值
- 变量在赋值(=)时就开辟了一个内存空间,内存值就是__等号右边的值__
- Python把一切数据都看成对象,它为每一个对象都分配一个内存空间,每个对象一旦被创建它的id就不会变化
- 当一个对象被创建后,它就不能被销毁,当没有变量指向该对象时,Python垃圾回收算法回收
Python修改变量指向,C修改变量的内容
a=1
id(a)
2645669734704
a=a+1
id(a)
2645669734736
表达式
- 表达式由运算符和操作数组成
- 产生或者计算新数据值的程序代码片段称为表达式
基本运算符
- + - * / %(取余) **(幂) //(地板除)
- 注意Python2中还是默认整数与整数相除的结果为整数
print(1+1)
print(10-1)
print(3*6)
print(10/2)
print(10/3)
print(2**3)
print(10//3)
2
9
18
5.0
3.3333333333333335
8
3
逻辑表达式
- and、or、not
- is、is not
- ==、!=
- is不仅仅判断两个对象内容是否相同,还需要判断两个对象地址是否相同
a=1
b=a
a is b
True
a=1
a=10
c=10
a is c
True
id(a)
2645669734704
id(b)
2645669734992
id(c)
2645669734704
关系表达式
- ==、!=
-
、>=、<、<=
位运算
- 对于正数,原码就是直接换算的二进制,补码、反码与原码相同
- 对于负数,原码就是直接换算的二进制,反码就是原码符号位不变其余各位取反,补码就是反码+1
- &、|、^、~、<<、>>
其它运算
- 赋值运算:=,+=,-=,*=,/=,%=,**=,//=
- 三元条件表达式:x if C else y
- 成员运算符 in,not in
输出 print()
- 控制台输出
- print()
** 格式化输出
** %
** format # 位置对应
** f
a=18
a
18
print("The age of {} is {}.".format("Bob",a))
The age of Bob is 18.
print("The age of {} is {}.".format(a,"Bob"))
The age of 18 is Bob.
b=("Bob",18)
print("The age of {0[0]} is {0[1]}.".format(b))
The age of Bob is 18.
b=("Bob",18)
print("The age of {b[0]} is {b[1]}.")
The age of {b[0]} is {b[1]}.
b=("Bob",18)
print(f"The age of {b[0]} is {b[1]}.")
The age of Bob is 18.
输入input()
- 参数提示字符串
- 返回值string
- 如何一次输入多个值???
a=input("请输入一个值:")
print(a)
请输入一个值:214434
214434
print(type(a))
print(a*3) # 字符串 * 代表重复
214434214434214434
a,b,c,d=input("输入四个值:").split()
e,f,g,h=input("输入四个值:").split(',')
输入四个值:1 2 3 4
输入四个值:5,6,7,8
a+e
'15'
eval(a+e)
15
eval(a)+eval(e)
6
条件语句
- python条件语句模板
if condition1:
block1
elif condition2:
block2
else condition3:
block3
- python中跟在if后面的condition不需要加括号
- python 3.10之前没有switch—case语句
循环语句
- 不定循环
while condition:
statement1
else:
statement2
- 确定循环
for 变量 in 可迭代对象:
statement1
else:
statement2
- 外加两个循环控制关键字,continue、break
- 可迭代对象指的是,元组、列表、字符串、range()
模块
- 模块是包含函数定义、类定义和变量的文件,后缀.py
- 模块的意义就是避免重复造轮子
- import numpy #导入模块
- import scipy,matplotlib #一次导入多个模块
- from……import…… #导入指定的内容
异常处理
try:
statement1
except[ExceptionName[as alias]]:
statement2
else:
statement3
finally:
statement4
1.3 Python 数据类型
- 数字类型:int、float、bool、complex
整数 int
** int整型数据四种表示方式:十进制、二进制 0b1001、八进制)0o567、十六进制0x12fe
** type()可以查看数据类型
** int(),oct(),hex(),float()可以进行数据类型转换
浮点数 float
** 二进制下浮点数都是不准确的,解决方案是引入decimal模块,见下例:
a=0.1
b=0.2
c=0.3
a+b-c
5.551115123125783e-17
import decimal as dc
a=dc.Decimal('0.1')
b=dc.Decimal('0.2')
c=dc.Decimal('0.3')
print(a+b-c)
0.0
复数
a=1+2j
a.real
a.imag
2.0
字符串 string
- 使用单引号或者双引号创建字符串
- 反斜杠用于字符转义
- ‘r’用于防止字符转义
- 包含单引号的字符串用双引号创建
- 包含双引号的字符串用单引号创建
- 反斜杠用自身转义 \
c="I'm a student"
print(c)
I'm a student
d='I\'m a teacher'
print(d)
I'm a teacher
addr='C:\Users'
File "C:\Users\ADMINI~1\AppData\Local\Temp/ipykernel_17216/2268028194.py", line 1
addr='C:\Users'
^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
addr='C:\\Users'
print(addr)
C:\Users
addr=r'C:\Users'
print(addr)
C:\Users
-
字符串索引
** StringName[Index]
** 支持负数索引 -
字符串截取
** StringName[SI:EI:step]
** StringName[SI:EI:step]中缺省值代表默认 -
字符长度
** len(string)获取字符串的字符数 -
字符串操作符
** 连接符+
** 复制符*
** 成员搜索符 in
** 成员搜素符 not in
** 原始字符串 r -
字符检索
** 统计指定字符串在另一个字符串中出现的次数 str.count(sub[start,[,end]])
** 是否包含指定的子字符串 str.find(sub[sart[,end]]),返回正向索引值,否则返回-1
** 是否以指定的字符串开头/结尾 str.startwith(sub[start,[,end]]),str.endwith(sub[start,[,end]]) -
字符串格式化
** 将字符(串)插入到带有字符串格式的字符中 %d,%s,%f
** %[-][+][0][m][.n] %exp,exp是要转换的项,如果有多个项则必须用元组来指定
** 字符串格式化函数 str.format()
{[index][:]}
** 位置映射
** 关键字映射
** 索引映射
string="ULOVENWPU"
print(string[1])
print(string[1:3:1])
print(string[-1::-1])
print(len(string))
print(string.count('U'))
print(string.find('O'))
'W'in string
item=('Daming',"NWPU")
print("I'm %s, a student in %s" %item)
L
LO
UPWNEVOLU
9
2
2
I'm Daming, a student in NWPU
列表 list
-
创建列表&删除列表
** 使用元素填充,lister=[元素1,元素2,……]
** 使用list()函数,lister=list(可迭代对象)
** 删除列表 del lister -
列表索引和切片
** 索引:获取指定位置的元素
** 切片:获取指定位置范围的元素 -
遍历列表
** for item in lister
** enumerate(lister) 输出索引值和元素值 -
列表添、删、改
** lister.append(新元素) 列表末尾追加元素
** lister.insert(Index,新元素) 指定位置插入新元素
** lister.entend(新列表) 将一个新列表插入列表后面
** 通过索引值获取元素并修改之
** del 删除指定位置
** remove 删除指定元素
-
列表统计计算
** lister.count(目标元素) 获取指定元素出现的次数
** lister.index(目标元素) 获取指定元素首次出现的索引值
** sum(lister) 列表元素求和 -
列表排序
** lister.sort() 列表对象方法
** sorted(interable,key=None,reverse=False) 内置函数BIM
lister1=["DaMing",1]
lister2=[list(range(10))]
print(lister1)
print(lister2)
print(list("Hello"))
del lister1[1]
lister1.remove("DaMing")
print(lister1)
['DaMing', 1]
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
['H', 'e', 'l', 'l', 'o']
[]
### 列表推导式
lister1=[]
for i in range(8):
lister1.append(i)
print(lister1)
### 快速列表生成
# lister = [Expression for var in range]
# lister = [Expression for var in list]
# newlister = [Expression for var in list if condition]
lister2=[i for i in range(18)] #range(n):0到n-1
print(lister2)
lister3=[i*i for i in lister2 if i%2==0]
print(lister3)
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]
[0, 4, 16, 36, 64, 100, 144, 196, 256]
二维列表
- 创建 matrix=[[1,2,3],[4,5,6],[7,8,9]]
- 二维列表推导式 seats=[[i*10+j for j in range(1,6)] for i in range(1,5)]
列表操作总结
- .append(x) # 添加元素x到列表末尾
- .sort(x) #
- .reverse(x)
- .index(x) # 返回指定元素的索引
- .insert(i,x)
- .count(x)
- .remove(x)
- .pop(x)
- len(list) # 求列表中元素个数
元组 Tuple
-
创建元组
** 逗号创建法 # 逗号才是元组的标志
** tuple() # 将可迭代对象转化为元组 -
访问元组
** print()打印
** 索引
** 切片 -
修改元组元素
** 元组不可以用索引修改元素,只能重新赋值
** 错误:c[6]=0
** 正确:c=(1,2,3) -
元组推导式
** tupler=tuple(Expression for var in interal)
a=(1)
b=(1,)
c=tuple(range(9))
print(type(a))
print(type(b))
print(type(c))
print(c[5])
print(c[-1:0:-1])
# c[6]=0
d=tuple(i*i for i in range(10))
print(d)
5
(8, 7, 6, 5, 4, 3, 2, 1)
(0, 1, 4, 9, 16, 25, 36, 49, 64, 81)
元组 V.S. 列表
字典
-
字典创建与删除
** 大括号创建
** zip() & dict()创建
** dict.fromkeys(interal) 创建值为空的列表
** del 删除整个字典
** dict.clear()删除字典元素 -
通过键访问值
** dict[key]
** dict.get(key[,default])函数 -
遍历字典
** dic.items() # 提取字典的每一个键值对生成列表
** dic.keys() # 提取字典的每一个键生成列表
** dic.values() # 提取字典的每一个值生成列表 -
添、改、删字典元素
** dic[key]=value
** del dic[key] -
字典推导式
** dic=dict({Key_Expression:Value_Expression for i in range(6)})
dic1={"Daming":"22","Xiaohong":"23","Limei":"24"} # 键必须唯一,值可以不唯一
list_key=list(("Daming","Xiaohong","Limei"))# 通过元组这个可迭代对象创建列表
list_vaule=list(("22","23","24"))# 通过元组这个可迭代对象创建列表
dic2=dict(zip(list_key,list_vaule)) # 通过dict()创建列表
print(dic2)
dic3=dict.fromkeys(tuple(i for i in range(9)))
print(dic3)
print(dic1["Xiaohong"])
print(dic1.get("Daming"))
print(dic1.items())
print(dic1.keys())
print(dic1.values())
dic4=dict({i:i*i for i in range(6)})
print(dic4)
{'Daming': '22', 'Xiaohong': '23', 'Limei': '24'}
{0: None, 1: None, 2: None, 3: None, 4: None, 5: None, 6: None, 7: None, 8: None}
23
22
dict_items([('Daming', '22'), ('Xiaohong', '23'), ('Limei', '24')])
dict_keys(['Daming', 'Xiaohong', 'Limei'])
dict_values(['22', '23', '24'])
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25}
集合 set
-
集合中元素是无序且不可重复
-
集合创建
** 大括号创建
** set(interal)创建 -
集合添加元素
** set.add(element) # element只可以是字符串、数字、布尔类型,不可以是列表、元组等可迭代对象 -
集合中删除元素
** set.remove(element) # 删除一个指定元素
** set.pop(element) # 随机删除一个元素
** set.clear() # 删除所有元素 -
集合运算
** 交集 &
** 并集 |
** 差集 -,只在一个集合出现且在另一个集合不出现
** 对称差集 ^,只在其中一个集合出现
set1={"Zhangsan","Lisi","Laoliu"}
set2={tuple(i for i in range(10))}
set3={i for i in range(10)}
print(set1)
print(set2)
print(set3)
{'Laoliu', 'Lisi', 'Zhangsan'}
{(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)}
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
Python数据类型总结
-
可变/不可变数据类型
** 二者的本质区别在于:内存地址所存储的值是否可以修改
** 不可变数据类型:数据类型变量值变化则对应的地址也变化,如:整数、浮点数、字符串、元组
** 可变数据类型:数据类型变量值变化对应的地址不变化,如:列表、字典、集合 -
数据类型转化
** int(x,[,base]) # 将整数x转化成base制的整数
** float(x)
** complex(real[,imag]}
** str(x) # 将对象x转换成字符串
** eval(str) # 计算字符串中的有效Python表达式
** tuple(s) # 将序列s转换成一个元组
** list(s) # 将序列s转换成一个列表
** set(s) # 将序列s转换成一个集合
** dict(s) # 将序列s转换成一个字典
** chr(n) # 将整数n转换成一个字符
深拷贝与浅拷贝???