是一个免费、开源、跨平台、动态、面向对象的编程语言。
在命令行输入指令,回车即可得到结果。
将指令编写到.py文件,可以重复运行程序。
计算机只能识别机器码(1010),不能识别源代码(python)。
-- 优点:运行速度快
-- 缺点:开发效率低,不能跨平台。
-- 优点:开发效率高,可以跨平台;
-- 缺点:运行速度慢。
源代码 -- 编译 --> 字节码 -- 解释 --> 机器码
|————1次———|
给人看的,通常是对代码的描述信息。
表示一个功能,函数定义者是提供功能的人,函数调用者是使用功能的人。
例如:
不能使用关键字(蓝色),否则发生语法错误:SyntaxError: invalid syntax。
class_name
变量名1 = 变量名2 = 数据
变量名1, 变量名2, = 数据1, 数据2
>>> a=10000
>>> b=10000
>>> a is b
False
>>> a=10000
>>> b=a
>>> a is b
True
del 变量名1, 变量名2
用于删除变量,同时解除与对象的关联.如果可能则释放对象。
每个对象记录被变量绑定(引用)的数量,当为0时被销毁。
如: -5, 100, 0
十进制:5
二进制:0b开头,后跟1或者0
八进制:0o开头,后跟0~7
十六进制:0x开头,后跟0~9,A~F,a~f(数据的内存地址是以16进制数表示的)
小数:1.0 2.5
科学计数法:e/E (正负号) 指数
1.23e-2 (等同于0.0123)
1.23456e5(等同于123456.0)
是用来记录文本信息(文字信息)。
字面值:双引号
str.upper():将字符串改为全部大写
str.lower():将字符串改为全部小写
str.title():将字符串中每个单词的首字母都改为大写
str.rstrip():删除右边空白
str.lstrip():删除左边空白
str.strip():删除两端空白
由实部和虚部组成的数字。
虚部是以j或J结尾。
字面值: 1j 1+1j 1-1j
用来表示真和假的类型
True 表示真(条件满足或成立),本质是1
False 表示假(条件不满足或不成立),本质是0,” ”
结果为False:bool(0) bool(0.0) bool(None)
4/2 返回的结果是 2.0
1 + 3.0 返回结果是: 4.0
+ 加法
- 减法
* 乘法
/ 除法:结果为浮点数
// 地板除:除的结果去掉小数部分(商为负数时去掉小数部分再 -1)向下圆整
% 求余
** 幂运算
优先级从高到低: ()
**
* / % //
+ -
y += x 等同于 y = y + x
y -= x 等同于 y = y - x
y *= x 等同于 y = y * x
y /= x 等同于 y = y / x
y //= x 等同于 y = y // x
y %= x 等同于 y = y % x
y **= x 等同于 y = y ** x
< 小于
<= 小于等于
> 大于
>= 大于等于
== 等于
!= 不等于
返回布尔类型的值
比较运算的数学表示方式:0 <= x <= 100
表示并且的关系,一假俱假。
示例:
True and True # True
True and False # False
False and True # False
False and False # False
表示或者的关系,一真俱真
示例:
True or True # True
True or False # True
False or True # True
False or False # False
表示取反
例如:
not True # 返回False
not False # 返回True
一但结果确定,后面的语句将不再执行。
语法:
x is y
x is not y
作用:
is 用于判断两个对象是否是同一个对象,是时返回True,否则返回False。
is not 的作用与is相反
高到低:
算数运算符
比较运算符
身份运算符
逻辑运算符
5. 如果逻辑行过长,可以使用隐式换行或显式换行。
隐式换行:所有括号的内容换行,称为隐式换行
括号包括: () [] {} 三种
显式换行:通过折行符 \ (反斜杠)n换行,必须放在一行的末尾,目的是告诉解释器,下一行也是本行的语句。
通常用来填充语法空白。
让程序根据条件选择性的执行语句。
if 条件1:
语句块1
elif 条件2:
语句块2
else:
语句块3
if,elif,else所对应的条件是彼此互斥的。:不能省略
elif 子句可以有0个或多个。
else 子句可以有0个或1个,且只能放在if语句的最后。
if 100:
print("真值")
等同于
if bool(100):
print("真值")
语法:变量 = 结果1 if 条件 else 结果2
作用:根据条件(True/False) 来决定返回结果1还是结果2。
可以让一段代码满足条件,重复执行。
while 条件:
满足条件执行的语句
else:
不满足条件执行的语句(可以看循环是从条件离开的还是从循环体离开的)
else子句可以省略。
在循环体内用break终止循环时,else子句不执行。
用来遍历可迭代对象的数据元素。适用于预定次数的循环
可迭代对象是指能依次获取数据元素的对象,例如:容器类型。
for 变量列表 in 可迭代对象:
语句块1
else:
语句块2
else子句可以省略。
在循环体内用break终止循环时,else子句不执行。
#示例
while True:
循环体(如需要多次输入,input)
if 条件:
break # 退出循环
用来创建一个生成一系列整数的可迭代对象(也叫整数序列生成器)。
range(开始点,结束点,间隔)
函数返回的可迭代对象可以用for取出其中的元素
返回的数字不包含结束点
开始点默认为0
间隔默认值为1
跳过本次,继续下次循环。
for 循环嵌套
1.end=""不换行,print()换行
2.外层循环做一次,内层循环全做完
3.外层循环控制行,内层循环控制列(控制一维,平面上的问题)
4.先写内再写外
数据 in 序列
数据 not in 序列
如果在指定的序列中找到值,返回bool类型。
正向索引从0开始,第二个索引为1,最后一个为len(s)-1。
反向索引从-1开始,-1代表最后一个,-2代表倒数第二个,以此类推,第一个是-len(s)。
从容器中取出相应的元素重新组成一个容器(在赋值号 ”=”右侧时),在赋值号(=)左侧时起定位作用定位多个元素。
容器[(开始索引):(结束索引)(:(步长))]
小括号()括起的部分代表可省略
结束索引不包含该位置元素
步长是切片每次获取完当前元素后移动的偏移量
4. 切片:定位多个元素
message = "我叫齐天大圣。"
print(message[2:6])# 齐天大圣
print(message[2:6:2])# 齐大
# 开始索引,默认从头开始。
print(message[:6])# 我叫齐天大圣
# 结束索引,默认到末尾。
print(message[2:])# 齐天大圣。
# 正向获取
print(message[:])# 我叫齐天大圣。
# 反向获取
print(message[::-1])# 。圣大天齐叫我
print(message[-3:-6:-1])# 大天齐
# 可以同时使用反向与正向索引
print(message[-3:1:-1])# 大天齐
print(message[3:1])# 空
print(message[3:1:-1])# 天齐
print(message[1:1])# 空
print(message[-2:1])# 空
print(message[1:500])# 叫齐天大圣。
由一系列字符序列组成的不可变容器,存储的是字符的编码值。
--ASCII编码:包含英文、数字等字符,每个字符1个字节。
--GBK编码:兼容ASCII编码,包含21003个中文;英文1个字节,汉字2个字节。
--Unicode字符集:国际统一编码,旧字符集每个字符2字节,新字符集4字节。
-- UTF-8编码:Unicode的存储与传输方式,英文1字节,中文3字节。
可见即所得。’’ “” ‘’’‘’’ “”””””
\’ \” \”””
\n 换行符输出
\\
\t 制表符,输出是缩进
\0 空字符
a = r”C:\newfile\test.py”
生成一定格式的字符串。(用于在字符串中插入变量的操作)
“%s---%d---%f” % (变量1,变量2,变量3)
"我的名字是%s,年龄是%d" % (name, age)
%s 字符串 %d整数 %f 浮点数(%.1f %.2f)
由一系列变量序列组成的可变容器。
列表名 = []
>>> list01=[100,200,300]
>>> list02=list01
>>> list01==list02
True
>>> list01 is list02
True
#注意:跟小整数对象池的区别
>>> list01=[100,200]
>>> list02=[100,200]
>>> list01==list02
True
>>> list01 is list02
False
列表名 = list(可迭代对象) #list(range(5))
>>> print(list(range(5)))
[0, 1, 2, 3, 4]
>>> print(list("abcde"))
[‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘]
>>> print(list("看书,跑步"))
[‘看‘, ‘书‘, ‘,‘, ‘跑‘, ‘步‘]
列表名.append(元素) --末尾追加
列表.insert(索引,元素) --插入
索引
list[index]=要改成的数据
切片(赋值号左边,不产生新列表)
list[:2]=[数据1,数据2]
遍历列表: #list.count(obj) #统计obj这个元素在列表list中出现的次数
正向:
for 变量名 in 列表名:
变量名就是元素
反向:
for 索引名 in range(len(列表名)-1,-1,-1):
列表名[索引名]就是元素
列表名.remove(元素a) ,只移除第一次出现的‘元素a’,返回值为none
#list.pop() 移除列表最后一个元素(返回值为被删除的元素,适用于从列表中移除后还需继续使用,括号中填上index可以删除任意位置元素)
del 列表名[索引或切片]
6.列表排序:
list.sort():按照首字母a-z或者数字0-9等规则排序,不能恢复原顺序,反向排序括号中输入参数reverse=true
sorted(list):按照首字母a-z或者数字0-9等规则排序,不改变列表原顺序
list.reverse():将列表中元素倒序排列,再使用一次.reverse()即可恢复
浅拷贝:复制过程中,只复制一层变量,不会复制深层变量绑定的对象的复制过程。
list02=list01[:](切片在赋值号右边)
>>> list01=[100,[200,300]]
>>> list02=list01[:] #切片产生的新列表只复制(重新生成)了list01的第一层
>>> list01[1][0]=500
>>> print(list02[1][0])
500
深拷贝:复制整个依懒的变量。
Import copy
list02=copy.deepcopy(list01)
https://www.jianshu.com/p/03dce38cc97e
7.05exercise08经典案例
将列表中多个字符串类型元素拼接为一个字符串。
result = "连接符".join(list) #list-->str
>>> list01=[‘a‘,‘b‘,‘c‘,‘d‘,‘e‘]
>>> strings="".join(list01)
>>> print(strings)
abcde
>>> print(",".join(list01))
a,b,c,d,e
将一个字符串拆分为多个。
list = “a-b-c-d”.split(“ - ”) #str-→list
>>> string="www.baidu.com"
>>> list01=string.split(".")
>>> print(list01)
[‘www‘, ‘baidu‘, ‘com‘]
使用简易方法,将可迭代对象转换为列表。
变量 = [变量1(可迭代对象中的元素)的表达式 for 变量1 in 可迭代对象]
变量 = [变量1(可迭代对象中的元素)的表达式 for 变量1 in 可迭代对象 if 条件]
如果if真值表达式的布尔值为False,则可迭代对象生成的数据将被丢弃。
list01 = [5,15,55,6,6,7]
需求1:将lie01中所有数据+1再存储另外一个列表
# list02 = []
# for item in list01:
# list02.append(item + 1)
list02 = [item + 1 for item in list01]
需求2:将lie01中大于10的数据,+1再存储另外一个列表
#list02 = []
#for item in list01:
# if item > 10:
# list02.append(item + 1)
list02 = [item + 1 for item in list01 if item > 10]
变量 = [表达式 for 变量1 in 可迭代对象1 for 变量2 in可迭代对象2]
result = []
for r in ["a", "b", "c"]:
for c in ["A", "B", "C"]:
result.append(r + c)
result = [r + c for r in list01 for c in list02]
>>> name="lzmly"
>>> t01=("qtx",name)
>>> name="mm"
>>> print(t01)
(‘qtx‘, ‘lzmly‘) →内存没变,结果也没变是因为变量指向的对象是字符串(不可变容器)
>>> list_names=["lzmly","mm"]
>>> tuple01=("qtx",list_names)
>>> list_names.append("zx")
>>> print(tuple01)
(‘qtx‘, [‘lzmly‘, ‘mm‘, ‘zx‘]) →内存没变,依然是两个变量(元素),变的是变量指向的对象(列表)
元组名 = ()
元组名 = tuple()
元组名 = (20,) #元组只有一个对象时要加 ,
元组名 = (1, 2, 3)
元组名 = 100,200,300
元组名 = tuple(可迭代对象)
>>> list01 = ["a","b"]
>>> tuple02 = tuple(list01)
>>> tuple02
(‘a‘, ‘b‘)
>>> print(tuple("看书,跑步,钢琴"))
(‘看‘, ‘书‘, ‘,‘, ‘跑‘, ‘步‘, ‘,‘, ‘钢‘, ‘琴‘)
索引(tuple[索引])、切片(tuple[::])
>>> tuple03 = ("a","b","c","d")
>>> print(tuple03[2])
c
>>> tuple03 = ("a","b","c","d")
>>> print(tuple03[1:3])
(‘b‘, ‘c‘)
正向:
for 变量名 in 元组名:
变量名就是元素
反向:
for 索引名 in range(len(元组名)-1,-1,-1):
元祖名[索引名]就是元素
变量交换的本质就是创建元组:x, y = (y, x) 。可通过元组给多个变量赋值
格式化字符串的本质就是创建元组:"姓名:%s, 年龄:%d" % ("tarena", 15)
字典名 = {键1:值1,键2:值2}
字典名 = dict (可迭代对象) 需要成对,用括号分开
>>> list01 = [["a","b"],("c","d")]
>>> dict02 = dict(list01)
>>> print(dict02)
{‘a‘: ‘b‘, ‘c‘: ‘d‘}
语法:
字典名[键] = 数据 #键相当于index的功能
说明:
键不存在,创建记录。
键存在,修改映射关系。
变量 = 字典名[键] # 没有该键则错误,所以查找前,一定通过in判断
用键直接获取的是键对应的值
dict02={‘a‘: ‘b‘, ‘c‘: ‘d‘}
>>> m=dict02["c"]
>>> print(m)
d
for 键名 in 字典名:
字典名[键名] -->值
示例:
dict02 = {"qtx":18,"ls":20,"ww":23}
for key in dict02:
print(key) #qtx ls ww -->键
print(dict02[key]) #18 20 23 -->值
for 键名,值名 in 字典名.items():
语句
示例:
for key in dict02.items():
print(key) #(‘qtx‘, 18) (‘ls‘, 20) (‘ww‘, 23) -->一系列(键,值)元组
print(key[0]) #qtx ls ww -->键
print(key[1]) #18 20 23 -->值
for key,value in dict02.items():
print(key,value) #qtx 18 ls 20 ww 23 -->键 值
print(key) #qtx ls ww -->键
print(value) #18 20 23 -->值
for value in dict02.values():
print(value) #18 20 23 -->值
for key in dict02.keys():
print(key) #qtx ls ww -->键
del 字典名[键] #键值一起删除了
使用简易方法,将可迭代对象转换为字典。
{键:值 for 变量 in 可迭代对象}
# 需求: key :0---9,value :键的平方
dict01 = {}
for item in range(10):
dict01[item] = item ** 2
dict02 = {item: item ** 2 for item in range(10)}
{键:值 for 变量 in 可迭代对象 if 条件}
# 需求:key:range(10) 大于5的数,value :键的平方
dict01 = {}
for item in range(10):
if item > 5:
dict01[item] = item ** 2
dict02 = {item: item ** 2 for item in range(10) if item > 5}
集合元素类型不可变:s=set();s.add([1,2]) #unhashable type: ‘list‘
集合名 = set() #只有这一种方式
集合名 = {1, 2, 3}
集合名 = set(可迭代对象)
集合名.add(元素)
集合名.discard(元素) #如果没有该元素则报错
集合名.remove(元素)
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s3 = s1 & s2 # {2, 3}
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s3 = s1 | s2 # {1, 2, 3, 4}
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s1 - s2 # {1} 属于s1但不属于s2
补集^:返回不同的的元素
s1 = {1, 2, 3}
s2 = {2, 3, 4}
s3 = s1 ^ s2 # {1, 4} 等同于(s1-s2 | s2-s1)
s1 = {1, 2, 3}
s2 = {2, 3}
s2 < s1 # True #包含于
s1 > s2 # True #包含
s1 = {1, 2, 3}
s2 = {3, 2, 1}
s1 == s2 # True
s1 is s2 #False
子集或相同,超集或相同 <= >=
使用简易方法,将可迭代对象转换为集合。
{表达式 for 变量 in 可迭代对象}
{表达式 for 变量 in 可迭代对象 if 条件}
不可变的集合。
固定集合可以作为字典的键,还可以作为集合的值。主要作用:与其他容器互相转换
创建固定集合:frozenset(可迭代对象)
等同于set
File -> Settings -> Editor -> General -> Code Completion -> Autopopup in (ms):0
Ctrl + P 参数信息(在方法中调用参数)提示输入什么参数
Ctrl + Q 快速查看文档(对函数形参和返回值的描述)
Ctrl + Alt + M 提取方法
提高代码的可重用性和可维护性(代码层次结构更清晰)。
def 函数名(形式参数):
函数体
def 关键字:全称是define,意为”定义”。
函数名:对函数体中语句的描述,命名规则与变量名相同。
形式参数:方法定义者要求调用者提供的信息。
函数体:完成该功能的语句。尽量小于10行
方法定义者告诉调用者的结果。
return 数据(或变量/表达式)
return后没有语句,相当于返回 None。
函数体没有return,相当于返回None。
返回值可能有多个,必须返回一个类型的值
数值型(整数,浮点数,复数)
布尔值bool
None 空值
字符串str
元组tuple
固定集合frozenset
列表 list
字典 dict
集合 set
不可变类型的数据传参时,函数调用后不会改变原实参数据的值。
可变类型的数据传参时,函数调用后可以(切片定位时)改变原数据。day08 demo01
函数体中,“变量[ ]”的存在可改变可变对象
定义:实参与形参的位置依次对应。
定义:实参用*将序列拆解后与形参的位置依次对应。
定义:实参根据形参的名字进行对应,调用函数时直接给形参赋值。
def fun01(a, b, c):
print(a)
print(b)
print(c)
# 1. 位置实参:实参根据位置与形参进行对应
# positional argument
fun01(1, 2, 3) #1 2 3
# 2. 序列实参:使用星号将序列中的元素拆开,与形参进行对应.
# 序列:字符串 列表 元组
list01 = ["aaa", "bb", "cc"]
fun01(*list01) # aaa bb cc
# 3. 关键字实参:实参根据名称与形参进行对应
fun01(b=2, a=1, c=3) # 1 2 3
# 4. 字典实参:使用双星号将字典中的元素拆开,根据键形参进行对应,传递值..
dict01 = {"c": 33, "a": 11, "b": 22}
fun01(**dict01) #11 22 33
def 函数名(形参名1=默认实参1, 形参名2=默认实参2, ...):
函数体
缺省参数必须自右至左依次存在,如果一个参数有缺省参数,则其右侧的所有参数都必须有缺省参数。
缺省参数可以有0个或多个,甚至全部都有缺省参数。
语法:
def 函数名(形参名1, 形参名2, ...):
函数体
def 函数名(*元组形参名):
函数体
收集多余的位置传参。
一般命名为‘args‘
形参列表中最多只能有一个
def 函数名(*, 命名关键字形参1, 命名关键字形参2, ...):
函数体
def 函数名(*args, 命名关键字形参1, 命名关键字形参2, ...):
函数体
强制实参使用关键字传参
def 函数名(**字典形参名):
函数体
收集多余的关键字传参
一般命名为‘kwargs‘
形参列表中最多只能有一个
位置形参 --> 星号元组形参 --> 命名关键字形参 --> 双星号字典形参
# 1. 默认形参:实参可以不传递数据(从右向左依次存在)
def fun01(a=0, b="bb", c=1.5):
print(a)
print(b)
print(c)
fun01()
fun01(1, "b")
# 关键实参 + 默认形参:调用者可以随意指定参数进行传递
fun01(b="bbbbb")
# 2. 星号元组形参:让位置实参的数量无限
def fun02(p1, p2, *args):
print(args)
fun02(1, 2) #()
fun02(1, 2, 3)#(3,)
fun02(1, 2, 3, 4, 5)#(3,4,5)
# 3. 命名关键字形参:传递的实参必须是关键字实参。
# 写法1:星号元组形参以后的参数是命名关键字形参
# p1 p2
def fun03(*args, p1="", p2):
print(args)
print(p1)
print(p2)
fun03(2, 2, p1=111, p2=222)
fun03(p1=111, p2=222)
fun03(p2=222)
# 案例:
# def print(*args, sep=‘ ‘, end=‘\n‘, file=None):
# 1---fff---3.5---4---55---6---67 ok
print(1, "fff", 3.5, 4, 55, 6, 67, sep="---", end=" ")
print("ok")
# 写法2:星号以后的位置形参是命名关键字形参
def fun04(*, p1=0, p2):
print(p1, p2)
fun04(p1=1, p2=2)
fun04(p2=2)
# 4. 双星号字典形参:让关键字实参的数量无限
def fun05(**kwargs):
print(kwargs)
fun05(a=1) # {‘a‘: 1}
fun05(a=1, b=2)
fun05(a=1, b=2, qtx=3) # {‘a‘: 1, ‘b‘: 2, ‘qtx‘: 3}
g01 = "悟空"
g02 = "八戒"
g03 = "沙僧"
def fun01():
l01 = 100
print(l01)# 只能在函数内部使用局部变量
print(g01)# 在函数内部可以访问全局变量
# 创建了局部变量g02,覆盖了全局变量g02
g02 = "老朱"
print("fun01---"+g02)
# 声明全局变量g03
global g03
g03 = "老沙"
fun01() #100 悟空 fun01---老朱
print("全局---"+g02) # 全局---八戒
print(g03) #老沙
# 练习:定义my_print函数,统计该函数调用的次数。
count = 0
def my_print():
global count
count = count + 1
my_print()
my_print()
my_print()
print(count)
在函数内部修改全局变量。
在函数内部定义全局变量(全局声明)。
global 变量1, 变量2, …
在函数内直接为全局变量赋值,视为创建新的局部变量。
不能先声明局部的变量,再用global声明为全局变量。
在内层函数修改外层嵌套函数内的变量
nonlocal 变量名1,变量名2, ...
在被嵌套的内函数中进行使用
原文:https://www.cnblogs.com/lennie-luo/p/12903491.html