文章目录
- 📚基础语法
- 🐇输入和输出
- 🥕`print()`输出
- 🥕`input()`输入
- 🐇 变量的命名
- 🐇条件判断
- 🥕单向判断
- 🥕双向判断
- 🥕多向判断
- 🥕if嵌套
- 🥕三元表达式
- 🐇和或非
- 📚数据类型
- 🐇数据类型
- 🐇类型转换
- 🐇四则运算
- 🐇数据的常用语法
- 🥕列表语法
- 👀列表特点
- 👀列表的操作
- 🥕字符串语法
- 🥕字典语法
- 🥕布尔值相关
- 📚循环
- 🐇for循环
- 🐇while循环
- 🐇while循环和for循环比较
- 🐇循环进阶
- 📚函数
- 🐇函数定义的语法
- 🥕参数的类型
- 🥕变量作用域
- 📚类与对象
- 🐇类的创建
- 🐇类的继承
- 📚模块
- 🐇模块类型
- 🥕内置模块
- 🐇模块和模块对象导入方法
- 🥕程序入口
👀说在前面:
python基础语法对照着C学,大体思想和方法都大差不差,但要关注python和C在表达上的不同点,即那些语法规则细节上的差异点
📚基础语法
🐇输入和输出
🥕print()
输出
- 第一种: 不带引号,让计算机读懂括号里的内容,打印最终的结果
print(1+1)
,输出2
- 第二种:带单引号,计算机无须理解,原样复述引号中的内容(双引号和单引号作用一样,一般使用英文单引号)
print('秋水共长天一色')
,输出秋水共长天一色
- 第三种:带三引号,实现换行用来包裹多行文本,按照原样打印出来
- 转义字符:当要打印的东西本身具有单引号——不需要被解析的引号面前加上反斜杠
\'
表示一个单引号,\"
表示一个双引号\a
响铃(BEL)
\b
退格(BS),将当前位置移到前一列
\f
换页(FF),将当前位置移到下页开头
\n
换行(LF),将当前位置移到下一行开头
\r
回车(CR),将当前位置移到本行开头
\t
水平制表(HT) (跳到下一个TAB位置)
\v
垂直制表(VT)
\\
代表一个反斜杠字符""
\'
代表一个单引号(撇号)字符
\"
代表一个双引号字符
\?
代表一个问号
\0
空字符(NUL)
\ddd
1到3位八进制所代表的任意字符
\xhh
1到2位十六进制所代表的任意字符
🥕input()
输入
🐇 变量的命名
- 只能是一个词;
- 只能包含字母、数字和下划线;
- 不能以数字开头;
- 尽量描述包含的数据内容;
- 不要使用python函数名和关键字。
🐇条件判断
🥕单向判断
如果条件成立,就执行语句
number = 6
if number > 3:
pirnt(number)
注意格式!
- if后面要加冒号,判断条件不用括号。
- 同时执行语句要缩进!
🥕双向判断
if…else… 条件成立执行if语句 ,否则执行else语句
🥕多向判断
多选一,让计算机最先判断最难满足的条件,if
…elif
…else
三个及其以上条件的判断
grade = 65
if 80 <= grade <=100:
print('成绩优秀')
elif 60 <= grade < 80:
print('成绩中等')
else :
print('成绩差')
if…else…和if…if…的区别
- if…else…一个条件满足后就不会进行其他判断(if代表的条件和else代表的条件是互斥的)
- if…if…会遍历所有条件,一个条件无论满足还是不满足,都会进行下一个条件的判断
🥕if嵌套
使用if进行条件判断 ,还希望在条件成立的执行语句中再增加条件判断 ,即if中还有if ,这两个if非平级(缩进超级重要)
🥕三元表达式
X = Y if 条件 else Z
,条件为真为Y,为假为Z
🐇和或非
- 和:
and
,或:or
,非:~
📚数据类型
🐇数据类型
- 字符串str:用引号括起来的文本(如:‘python’、‘123’)
- 整数int:不带小数点的数字(如:-1、1、0、520、1314)
- 浮点数float:带小数点的数字,运算结果存在误差(如:-0.15、3.1415、1.0)
- 列表list:是一种有序的集合,可以随时增加或删除其中的元素。标识是中括号
[]
。 - 元组tuple:一种类似列表的数据类型,但是不能被修改。
- 字典dict:全称为dictionary,使用键值对(key-value)作为存储方式。标识是大括号
{}
。- 字典中的键需要是唯一的,如果字典中有两个相同的 键,Python 只会保留后面那个。而值则没有限制,可以是任意类型的,也可以有相同的值。
- 布尔值bool:表示真假的数据类型,只有两个值,True和False。
type()
函数判类型len()
用于检查某个数据长度- 可变类型与不可变类型
🐇类型转换
str()、float()、int()、list( )
- 不能将字符串和整数相联加——常用到数据类型转换
- input本身都是字符串——常用到数据类型转换,
score=int(input('输入分数:'))
- 任何类型都可以转换为字符串
- 不是所有都能转换成整数/浮点数示例举例
- 文本类字符串和浮点形式的字符串不能转化为整数
- 文字类型字符串无法转换为浮点数
- 浮点数转化为整型是对浮点数直接抹零取整。
- list() :将数据转换为列表类型
[‘p’, ‘y’, ‘t’, ‘h’, ‘o’, ‘n’, ‘基’, ‘础’]a = 'python基础' print(list(a))
🐇四则运算
运算优先级:从左到右顺着来,括号里的优先算,乘除排在加减前。
🐇数据的常用语法
🥕列表语法
👀列表特点
- 项目之间有先后顺序
- 列表内容可以编辑
- 可记录的项目各式各样
- 示例:
students=[A, B, C, D]
- 一般推荐逗号与下一个元素之间加一个空格
- 在实际写代码的过程中,统一段代码不要出现函数名和列表名相同的情况,不然会报错。
👀列表的操作
对列表元素的处理
-
⚠️由索引取元素
- 正向索引
print(students[2])
,列表中正向索引是从0开始数的 - 反向索引
print(students[-1])
,反向索引倒数几个从-1开始数
- 正向索引
-
⚠️查列表元素索引:
列表.index(元素内容)
,关注从0开始索引 -
⚠️列表元素的修改:
列表[索引] = 新值
-
⚠️列表元素的添加
- ⭐️直接添加(默认在列表末尾添加):
列表.append(元素)
- 用append时不能对列表赋值,以下输出None,第二行语法错误
list = ['松','竹'] list = list.append('梅') print(list)
- append不能一次添加多个元素,以下TypeError: append() takes exactly one argument (2given)
ist = ['松','竹'] list.append('梅','岁寒三友') print(list)
- 用append时不能对列表赋值,以下输出None,第二行语法错误
- ⭐️在列表中间某个位置插入一个元素:
列表.insert(9,元素)
,即在第10位插入B,此时排在插入值后的索引值自动+1
- ⭐️直接添加(默认在列表末尾添加):
-
⚠️列表元素的删除
- ⭐️
列表.pop(索引)
:如果不填索引就默认为最后一个,pop删除会显示删除的具体值。
以students=[A, B, C, D]为例,例:
punished=students.pop(1)
,输出 punished=B- ⭐️
del列表[索引]
:这里的删除不会显示被删的具体值- 每次只能删除一个元素
- 连续删除多个元素是,记得重新计算偏移值
[‘竹’, ‘梅’]list = ['松','竹','梅'] del list[0] print(list) del list[0] print(list)
[‘梅’] - ⭐️
列表.remove(值)
:在列表中找到的第一个指定的值,然后将它删除
- ⭐️
-
⚠️列表的分片:列表层面的提取,一次提取若干个元素,提出来的是列表
列表[起始索引:结束索引]
例:若要获取第三到第五个元素,应为列表[2,5]- 若是从头开始,则可写为
列表[:3]
,同理最后可为列表[10:]
,也可用反向索引列表[-4:]
- 列表分片必须用整数而不可以用浮点数,因此和/运算符相关的要把结果转化为整数
对列表的处理
-
⚠️列表的修改(同样是使用赋值语句,注意是对列表的赋值)
list = ['松','竹','梅'] list[:] = ['岁寒三友'] print(list)
[‘岁寒三友’]
list = ['松','竹','梅'] list[:] = '岁寒三友' print(list)
[‘岁’, ‘寒’, ‘三’, ‘友’]
-
⚠️统计列表中某元素出现的次数:
列表.count(元素)
-
⚠️排序:
列表.sort()
字符串列表默认按首字母排列,数值列表默认是从小到大排列 -
⚠️反转:
列表.reverse
-
⚠️复制:
列表.copy()
若直接A=B,不是复制,只不过是给列表改了个名字 -
⚠️清空:
列表.clear()
-
⚠️列表的删除:
del 列表[分片]
-
⚠️列表的增加 (列表的增加叫作列表的合并会更合理), 使用符号’+’
- 符号’+'只能用在列表之间,不能用在列表和元素之间
- 顺序:在加号前的元素排在新列表的前面
-
⚠️列表的乘法
列表*n
:实质即为加了几次
列表的拓展操作
- ⚠️
zip(列表1,列表2)
:将两个长度相同的列表合并起来,对应位置完成合并,组队变成元组 - ⚠️
enumerate(列表,1)
:枚举功能,默认从1开始
- 上述两个操作所形成的的均为元组
- 元组:用圆括号包裹,元组里的元素不可以增改删但可以查询和分片和加法乘法。
- 只有一个元素的元组,在格式上与列表不同,写为(x ,)
元组和列表的互换- 元组→列表:
list(元组)
- 列表→元组:
tuple(列表)
- 元组→列表:
- 所以上述两个拓展操作两者返回对象再用
list()
转换为二维列表- 二维列表:通用格式:
列表名[行数-1][列数-1]
- 二维列表:通用格式:
🥕字符串语法
- 字符串的索引和分片规则均与列表同,分片范围超出总长度不会报错,但索引取值(print(string[100000])这种形式)超出范围会报错。
- 可以把字符串想象成一根绳子,分片就是用刀将绳子切分开来。在字符串长度内分片相当于在绳子上切割,而超出范围相当于一刀砍到了空气,对于绳子来说没有影响。
- 字符串的不可变性
- 字符串一旦创建后是不可以改变的,这个属性和元组类似,通过索引来改变字符串中的元素就会报错
- 想要修改字符串内容可
使用字符串分片和拼接去生成一个新的字符串
大小写互换
分割、组合与移除
定位与替换
字符串格式化输出
-
常见的占位符:
%d
整数,%f
浮点数,%s
字符串:%s是万能的,它会把任何数据类型转换为字符串,%x
十六进制整数 -
format()
方法使用{}
作为占位符,然后按照参数顺序替换对应的占位符。
- 我们还可以给占位符命名,命名后参数顺序不再重要
- 我们还可以给占位符命名,命名后参数顺序不再重要
🥕字典语法
字典数据的提取
列表使用偏移量来提取,字典使用键来提取
group = {'师父':'唐三藏', '大师兄':'孙行者', '二师兄':'猪八戒', '沙师弟':'沙和尚'}
print(group['师父'])
唐三藏
字典数据的修改
group = {'师父':'唐三藏', '大师兄':'孙行者', '二师兄':'猪八戒', '沙师弟':'沙和尚'}
group['师父']='唐玄奘'
print(group)
{‘师父’: ‘唐玄奘’, ‘大师兄’: ‘孙行者’, ‘二师兄’: ‘猪八戒’, ‘沙师弟’: ‘沙和尚’}
字典数据的添加
group = {'师父':'唐三藏', '大师兄':'孙行者', '二师兄':'猪八戒', '沙师弟':'沙和尚'}
group['白龙马']='敖烈'
print(group)
{‘师父’: ‘唐三藏’, ‘大师兄’: ‘孙行者’, ‘二师兄’: ‘猪八戒’, ‘沙师弟’: ‘沙和尚’, ‘白龙马’: ‘敖烈’}
字典数据的删除
group = {'师父':'唐三藏', '大师兄':'孙行者', '二师兄':'猪八戒', '沙师弟':'沙和尚'}
del group['师父']
print(group)
{‘大师兄’: ‘孙行者’, ‘二师兄’: ‘猪八戒’, ‘沙师弟’: ‘沙和尚’}
提取字典中所有的键dict.keys()
提出来的键是元组形式应该用list转化为列表
group = {'师父':'唐三藏', '大师兄':'孙行者', '二师兄':'猪八戒', '沙师弟':'沙和尚'}
print(group.keys())
#dict_keys(['师父', '大师兄', '二师兄', '沙师弟'])
#打印出了所有字典的键,但是都是元组的形式
group = {'师父':'唐三藏', '大师兄':'孙行者', '二师兄':'猪八戒', '沙师弟':'沙和尚'}
print(list(group.keys()))
#['师父', '大师兄', '二师兄', '沙师弟']
提取字典中所有的键值对dict.items()
group = {'师父':'唐三藏', '大师兄':'孙行者', '二师兄':'猪八戒', '沙师弟':'沙和尚'}
print(group.items())
dict_items([(‘师父’, ‘唐三藏’), (‘大师兄’, ‘孙行者’),(‘二师兄’, ‘猪八戒’), (‘沙师弟’, ‘沙和尚’)])
通过键获取字典对应的值dict.get('键','*')
当键不存在时,不会报错,而是默认返回none,也可以通过第二个参数设置不存在时的默认返回值。
🥕布尔值相关
- bool() 检查数值的真假
假 | 真 |
---|---|
0 | 任意整数/浮点数 |
‘’(空字符串) | ‘嘿嘿’(字符串) |
[](空列表) | [1,2,3] |
{}(字典) | {1:‘a’,2:‘b’} |
None |
- if自动进行布尔类型转换
- 比较运算符产生布尔值
- 成员运算符产生布尔值
in
属于 ,如果值在指定序列里,条件为真not in
不属于, 如果值不在指定序列里,条件为真- 例:
print('He'in'Hello')
,True
- 逻辑运算符产生布尔值
and
且 连接两个布尔值,如果两个都为真,该条件才为真or
或 连接两个布尔值,如果有一个为真,该条件即为真not
非 反逻辑状态,a为True,not a则为False,反之亦然
📚循环
和C思想都一样,就是语法上有一点差别
🐇for循环
-
for…in range():处理指定次数的循环
-
列表生成式:
y = [表达式 for x in range(A,B) if 条件]
y = [] for x in range(1,11): if x%2 == 1: y.append(x*x) print(y)
就等价于
y = [ x*x for x in range(1,11) if x%2 == 1]
-
zip函数+for循环
# 客人编号 ids = [1, 2, 3] # 客人名字 names = ['派大星', '章鱼哥', '珊迪'] # 遍历按编号、名字顺序组合起来的数据 for id, name in zip(ids, names): print(str(id) + '号:' + name) ''' 输出: 1号:派大星 2号:章鱼哥 3号:珊迪 '''
-
enumerate函数+for循环
# 等待就餐的客人列表 names = ['派大星', '章鱼哥', '珊迪'] # 遍历按序号、名字组合起来的数据 for id, name in enumerate(names, 1): print(str(id) + '号:' + name) ''' 输出: 1号:派大星 2号:章鱼哥 3号:珊迪 '''
🐇while循环
- 当条件为真时,执行循环语句,只要条件为真,便会一直循环
- 在编程中,一个靠自身控制无法终止的程序称为 死循环。为了避免写出死循环,我们要保证循环条件最终可以变为 False。进入死循环,按Ctrl+C及时终止
🐇while循环和for循环比较
- for擅长处理固定次,自动遍历各序列
- while处理不定次数的循环,条件为False便停止
🐇循环进阶
-
break
如果满足条件,则结束循环# 店里现在还剩 3 份食材 left = 3 for i in range(1, 6): print('为第' + str(i) + '位客人做一份蟹黄堡') left -= 1 if left == 0: break print('食材没有了,明天再来吧') ''' 输出: 为第1位客人做一份蟹黄堡 为第2位客人做一份蟹黄堡 为第3位客人做一份蟹黄堡 食材没有了,明天再来吧 '''
-
continue
如果满足条件,则跳过当前循环的剩余语句,直接开始下一轮循环# 建立一个列表,储存客人的名字 names = ['泡芙老师', '珊迪', '痞老板', '章鱼哥'] for name in names: if name == '痞老板': print('海绵宝宝拒绝给痞老板做蟹黄堡') continue print('给' + name + '做一份蟹黄堡') ''' 输出: 为泡芙老师做一份蟹黄堡 为珊迪做一份蟹黄堡 海绵宝宝拒绝给痞老板做蟹黄堡 为章鱼哥做一份蟹黄堡 '''
-
循环嵌套:即循环中有循环
📚函数
- 函数是组织好的、可以重复使用的、用来实现单一功能的代码
- 函数类型可分为自定义函数和内置函数,自定义函数是需要自己定义,而内置函数是python内部已经定义好的函数,比如print()、input()等
🐇函数定义的语法
def circle(r):
c = 2 * 3.14 * r
# 先打印计算结果
print('该圆的周长是' + str(c))
# 函数体最后一行加上 return 语句
return c
result = circle(2)
print(result)
🥕参数的类型
-
位置参数:调用的时候直接以一个量对应函数形参的相应位置,因此位置不能随意更换
-
关键字参数:调用的时候,在那个量之前加上称号,相当于给那个量标了名字。即按参数名 = 值的格式传入参数
-
默认参数:为了减少重复输入
-
不同参数之间的规则
- Python 在解析参数时,是优先考虑 位置参数 的,所以位置参数一定要放在关键字参数之前。
- 默认参数一定要放在最后面
🥕变量作用域
-
局部变量:只能函数内或者一定代码块内生效
-
全局变量:在全局内生效的变量
global
:将局部变量转化为局部变量- python内置函数
-
如果局部变量和全局变量的名称相同,那函数内部会有限访问局部变量,外部会访问全局变量。
school = '双叶幼儿园' def welcome(): school = '春日部幼儿园' print('欢迎来到' + school) welcome() # 访问的 school 是函数内的局部变量 # 输出:欢迎来到春日部幼儿园 print('欢迎来到' + school) # 访问的 school 是全局变量 # 输出:欢迎来到双叶幼儿园
-
但加了global的局部变量会自动取代它之前定义的全局变量并一直沿用下去。
📚类与对象
- 类:具有相同属性和方法的对象的抽象 实例:类的个例
- 对象:Python中的对象是类和实例的集合,类可以看作是对象,实例也可以看作是对象
🐇类的创建
- 定义类之后,首先要把类实例化,再通过
实例名.属性名
和实例名.方法名()
来调用类的属性和方法。 - 定义类的方法时,self 用来代表类创建的实例,千万别忘了它;
- 如果要在方法内部调用类的其他方法和属性,也要成
self.属性名
或self.方法名()
才不会报错。 - 定义类的方法时,第一个参数 self 不能丢,调用方法时要忽略;Python 是== 强制性== 地将 实例对象本身 传递给类方法的 第一个参数
🐇类的继承
class 子类名(父类名)
,继承不只是子类继承父类的属性和方法,当父类还有自己的父类时,子类也能继承父类的父类的属性和方法
- 新增 :指在继承父类的属性和方法的基础上添加自己独有的属性或方法。比如:师傅传授给你一套武功,你自己又练了别的功法,这样你就既继承了师傅的功法,也独创了自己的功法。
- 重写 指在继承父类的属性和方法的基础上重写父类的属性和方法。比如:师傅传授给你一套武功,你对其进行了改进,同样的功法就变成你的独创功法。
📚模块
🐇模块类型
🥕内置模块
-
time模块
-
datetime 模块
-
datetime
日期获取
-
timedelta()
用于日期计算
-
-
random模块
-
math模块
🐇模块和模块对象导入方法
🥕程序入口
- 如果
abc.py
以导入的方式被运行,那 abc.py 中的__name__
值就是'abc'
; - 如果
abc.py
被直接运行,那 abc.py 中__name__
的值会被改为'__main__'
。
# other.py
print('我是 other 模块')
if __name__ == '__main__':
print('other 模块被直接运行了')
# main.py
import other
print('我是 main 模块')
if __name__ == '__main__':
print('main 模块被直接运行了')
'''
输出:
我是 other 模块
我是 main 模块
main 模块被直接运行了
'''