【Python】01:Python基础语法(一)
序言:编写Python代码的一些注意事项
-
代码要整洁/美观(必要时在字符之间加空格)
-
Python的一个设计哲学:解决一个问题,只提供一种方案~
-
在Python中报错,有两种情况:
-
语法错误。在程序运行之前,Python解释器就能把错误识别出来。
-
运行错误。在程序运行之前,识别不了的,必须要执行到对应的代码,才能发现问题。(也叫做“抛出异常”,如果程序出现“抛出异常”,程序直接终止,异常后面的代码也不会执行。)
-
-
在Python中,一个语句写完了以后,分号可有可无。如果多个语句写到同一行,那么语句和语句之间务必要加上分号(这种写法不推荐)。
-
在Python中如果要使用外部模块,务必在使用之前声明import “外部模块”。
一、常量和表达式
1.print函数
1.1 print函数可以计算四则运算的结果;
print(1 + 2 - 3)# 0
print(1 + 2 * 3)# 7
print(1 + 2 / 3)# 1.66666666666665
1.2 在Python中,2/3得到的结果是0.66666666……,而不是0!
而在C/Java中,整数 / 整数 的结果还是整数,并且会把小数部分直接舍弃!
1.3 在编程中,一般没有“四舍五入”的规则。对于浮点数具有一定的标准(.IIEEE754),这套规则在内存中表示浮点数的时候,可能会存在微小的误差。
2.常量和表达式
2.1 在上述代码中,形如 1 + 2 - 3 称为表达式;
2.2 这个表达式的运算结果,称为表达式的返回值;
2.3 “1 2 3”这样的数字,称为字面值常量;
2.4 + - * / 称为运算符/操作符;
2.5 在Python中,用**n表示n次方;
示例
print( (67.5 + 89.0 + 12.9 + 32.2) / 4 )
二、变量和类型
1.认识变量
示例
计算67.5、89.0、12.9、32.2的方差
avg = (67.5 + 89.0 + 32.2 + 12.9) / 4
total = (67.5 - avg) ** 2 + (89.0 - avg) ** 2 + (32.2 - avg) ** 2 + (12.9 - avg) ** 2
print(total / 3)
# 其中avg total均为变量
变量可以视为是一块能够容纳数据的空间,变量是存储在内存上面的。
2.创建变量
a = 10
2.1 “a”是变量名,“=”表示赋值运算符,不是数学上的比较相等。
2.2 变量命名的规则
- 变量名必须由数字、字母、下划线构成。不能包含特殊符号。
a*a 不合法
- 变量名不能由数字开头。
1a 不合法
- 变量名不能和Python的关键字重复。
if 这种变量名不合法
- 4.Python中的变量名是大小写敏感的,区分大小写。
Num = 10 num = 10
-
软性规则(建议遵守)
-
给变量命名是尽量使用描述行的单词,尽量通过名字来表现出变量的作用。
-
当使用一个单词描述不清楚时,可以使用多个单词来命名。
驼峰命名、蛇形命名等...
-
3.变量的使用
3.1 读取变量的值
a = 10# 创建变量(初始化)
print(a)
3.2 修改变量的值
a = 10# 创建变量(初始化)
a = 20# 修改a的内容(赋值)
print(a)
4.变量的类型
Python中变量的类型,不需要再定义变量的时候显式声明。
而只是依靠初始化语句,根据初始化的值的类型来进行确定的。
4.1 整数 int
a = 10
print(type(a))
# <class 'int'>
在Python中,int能表示的数据范围,是“无穷”的。(对比Java int的范围为-21亿~+21亿)
Python 的 int 是可以根据表示的数据的大小,自动扩容。
因此Python中没有long这样的类型,类似的,byte,short这些类型在Python中也不存在。
4.2 浮点数(小数) float
b = 0.5
print(type(b))
# <class 'float'>
Python中的 float 就是双精度浮点数。(等同于C++/Java中8个字节的double类型)
4.3 字符串 str
c = 'hello'
print(type(c))
d = "hello"
print(type(d))
# <class 'str'>
# <class 'str'>
Python中要求使用引号(’ '、" "均可)把一系列字符引起来,就构成了字符串。
Question1:如果要打印字符串中的引号?
e = 'My name is "Li Hua"'
print(type(e))
print(e)
# <class 'str'>
# My name is "Li Hua"
如果字符串中包含了双引号,表示字符串就可以用单引号引起来。
如果字符串中包含了单引号,表示字符串就可以用双引号引起来。
Question2:如果同时有单引号和双引号,怎么办?
f = '''My 'name' is "Li Hua"'''
print(f)
# My 'name' is "Li Hua"
Python中还有一种字符串,用三引号(三个单引号或三个双引号)表示。
4.3.1 用len函数求字符串的长度
f = '''My 'name' is "Li Hua"'''
print(len(f))
# 21
4.3.2 字符串的拼接运算
a1 = 'hello'
a2 = ' world'
print(a1 + a2)
# hello world
新的字符串对原来的字符串没有影响。
注意:字符串不能和数字混合相加!
a1 = 'hello'
a2 = 10
print(a1 + a2)
# 报错

4.4 布尔 bool
布尔的取值只有真和假。因此布尔类型主要用于逻辑判定。
真(True)假(False)
c1 = True
c2 = False
print(type(c1))
print(type(c2))
# <class 'bool'>
# <class 'bool'>
- 注意,如果把整数和布尔类型的值进行算术运算,此时就会把True当做1,False当做0。(C/C++中也有类似操作,但Java直接报错)
4.5 其他类型
除了上述类型之外,Python中还有list,tuple,dict,自定义类型等等。
4.6 变量类型的意义
4.6.1 不同的类型,占用的内存空间是不同的(占几个字节)。
-
int 4个字节,动态扩容
-
float 固定8个字节
-
bool 1个字节就够了
-
str 取决于字符串的长度
4.6.2 不同的类型,对应的操作也是不同的。
| int / float | + - * /均可执行 | 无法使用len |
|---|---|---|
| str | +可执行 - * /均无法执行 | 可以使用len |
4.7 动态类型特性
程序运行的过程中,变量的类型可能会发生改变。
a = 10
print(type(a))
a = 'hello'
print(type(a))
a = True
print(type(a))
# <class 'int'>
# <class 'str'>
# <class 'bool'>
一个编程语言,是否是动态类型,只是取决于运行时,类型是否会发生改变。
不取决于变量定义的时候是否声明类型!
而Python作为一个动态类型的语言,在定义变量的时候,也是可以写类型的!(但并不影响动态类型的特性)
a:int = 10
print(type(a))
a:str = 'hello'
print(type(a))
a:bool = True
print(type(a))
# <class 'int'>
# <class 'str'>
# <class 'bool'>
4.8 静态类型特性
程序运行的过程中,变量的类型始终不变。
C++/Java中:int a = 10;
a这个变量在程序运行的整个过程中,始终都是int,如果尝试a = “hello” ,编译器就会报错。
结论:相比之下,尤其是在一些大型(多人协作)的程序中,静态类型要优于动态类型(更稳定,不容易出错)。
三、注释
1.注释的定义
注释是一种特殊的代码,它不会影响到程序的执行,但是能够骑到解释说明的作用,能够帮助程序员理解程序代码的执行逻辑。
2.注释的语法
2.1 行注释
# 这是一行注释。
批量注释/还原代码:Ctrl + /
2.2 文档字符串
使用三引号引起来的叫文档字符串。可以注释多行内容,一般放在文件/函数/类的开头,“”"或’''均可。
"""
这是一段文档字符串。
"""
'''
这是一段文档字符串。
'''
3.注意事项
-
注释的内容应该是准确的。(修改代码注释要同步修改)
-
篇幅合理,既不要太精简,也不要长篇大论。
-
使用中文。
-
内容要积极向上,不要有负能量。
四、程序的输入和输出
1.和用户交互
-
用户把信息传递给程序,称为“输入”。
-
程序把结果展示给用户,称为“输出”。
输入输出最基本的方式就是控制台。用户通过控制台输入一些字符串,程序在通过控制台打印出一些字符串。
控制台:PyCharm、 Windows cmd……


2.输出到控制台
a = 10
print(f"f(a) = {a + 20}")# f(a) = 30
这个语法,叫做“格式化字符串”,记作“f-string”(f表示format)。
这时就可以使用 { } 这样的语法,向字符串里嵌入变量或者表达式。
3.从控制台输入
num = input("请输入一个整数:")# 请输入一个整数:
print(f"您输入的整数是:{num}")# 您输入的整数是:36
input执行的时候,就会等待用户输入。
num = input("请输入一个整数:")
print(type(num))
print(f"您输入的整数是:{num}")
# 请输入一个整数:36
# <class 'str'>
# 您输入的整数是:36
input返回的值,其实是一个字符串str。
-
如果只是单纯的拿到用户的输入,然后打印,那么此时就按照str打印即可。
-
如果需要根据用户输入的内容进行算数计算,此时就需要先把读取到的str类型转化为int类型。
- 可以使用int():
a = int(input("请输入一个数字:"))
- 可以使用int():
m = input('请输入第一个整数:')
n = input('请输入第二个整数:')
print(f'm + n = {m + n}')
m = input('请输入第一个整数:')
n = input('请输入第二个整数:')
m = int(m)
n = int(n)
print(f'm + n = {m + n}')
# 请输入第一个整数:10
# 请输入第二个整数:20
# m + n = 1020
# 请输入第一个整数:10
# 请输入第二个整数:20
# m + n = 30
推广:类型转换,例如int(),str(),float()……
f1 = input('请输入第一个数字:')
f2 = input('请输入第二个数字:')
f3 = input('请输入第三个数字:')
f4 = input('请输入第四个数字:')
f1 = float(f1)
f2 = float(f2)
f3 = float(f3)
f4 = float(f4)
avg = (f1 + f2 + f3 + f4) / 4
print(f'平均值是:{avg}')
# 请输入第一个数字:10.5
# 请输入第二个数字:20.5
# 请输入第三个数字:30.5
# 请输入第四个数字:40.5
# 平均值是:25.5
五、运算符
1.算术运算符
原则:先算乘方,再算乘除,最后算加减。如果想修改运算顺序,就要加()。
-
除法的第一个问题:有些编程语言中,\0被视为抛出异常,但\0.0则会得到一个无穷大的值。而Python中则一视同仁地视为抛出异常。
-
除法的第二个问题:整数 / 整数如果除不尽,就会得到小数,不会截断。(除了Python语言,大部分的编程语言,都是整数 / 整数结果是整数。)
-
**既能支持整数次方,也能支持小数次方。
-
//表示地板除法(取整除法),会针对计算的结果“向下取整”。
print(7 // 2)# 3 print(-7 // 2)# -4
2.关系运算符
关系运算符就是在比较两个操作数之间的“大小”、“相等”这样的关系。
-
关系运算符对应的表达式的“值”是布尔类型。符合表达式为“真”
a = 10 b = 20 print(a < b)# True print(a > b)# False -
关系运算不仅可以比较数字,还可以比较字符串。
-
比较规则:按照字典序。如果首字母不同,谁小谁就排在前面;如果首字母相同,以此类推。
-
注意:针对中文字符串比较大小是没有意义的。
a = 'hello' b = 'world' print(a < b)# True print(a > b)# False -
-
在C语言中,用strcmp函数比较字符串(如果直接使用本质是在比较两个字符串首元素的地址);在Java中使用equals方法比较字符串(如果直接使用本质上是在比较两个字符串是否是同一个对象)。相比之下,Python中的“==”和“!=”才是大众的方法。
-
针对浮点数来说,使用来比较相等,存在一定的风险。因为浮点数在内存中的存储和表示是可能存在误差的,这样的误差在算术运算的时候可能会被放大,从而导致的判定出现误判。
print(0.1 + 0.2 == 0.3) print(0.1) print(0.2) print(0.1 + 0.2) print(0.3) # False # 0.1 # 0.2 # 0.30000000000000004 # 0.3 -
正确的比较浮点数相等的方法:作差,看差值是否小于预期的误差范围。
- Python中支持连续小于的写法。C/C++/Java中是不支持的。
a = 0.1 + 0.2 b = 0.3 print(-0.000001 < (a - b) < 0.000001)# True
3.逻辑运算符
3.1 and 并且
两侧操作数均为True,表达式的值为True,否则为False(一假则假)。
- 短路求值:如果左侧表达式为False,那么整体的值一定是False,不必计算右侧的表达式。
3.2 or 或者
两侧操作数均为False,表达式的值为False,否则为True(一真则真)。
- 短路求值:如果左侧表达式为True,那么整体的值一定是True,不必计算右侧的表达式。
3.3 not 逻辑取反
只有一个操作数。操作数为True,则返回False;操作数为False,则返回True。
a = 10
b = 20
c = 30
print(a < b and b < c)# True
print(a < b and b > c)# False
# a < b and b < c 等价于 a < b < c
print(a < b < c)# True
print(a > b or b < c)# True
print(a < b or b > c)# True
print(a > b or b > c)# False
print(not a < b)# False
print(not a > b)# True
4.赋值运算符
4.1 “=”的使用
= 表示赋值,意思是把右侧的值填充到左侧的空间(变量)中。
-
链式赋值(a = b = 10):注意,一般不建议“链式赋值”。
-
多元赋值(a , b = 10 , 20):能解决一些特殊问题。
- 例如,交换两个变量。
a = 10 b = 20 a , b = b , a print(a , b)# 20 10
4.2 复合赋值运算符
+= -= *= /= %= **= //= ……叫做复合赋值运算符。
a = a + 1
a += 1
# 这两种写法等价
-
注意,在C++/Java中“a++/++a”的自增/自减操作在Python中不支持。
- 之所以++a没有报错,是因为Python解释器把“+”当成了正号。
4.3 其他
Python中还有身份运算符(is/is not),成员运算符(in/not in),位运算符(& | ~ ^ << >>)等
六、顺序语句
默认情况下,Python的代码的执行顺序是按照从上到下的顺序依次执行的。
这个顺序是不会乱的。
七、条件语句
条件语句能够表达“如果...否则...”这样的语义。这构成了计算机中基础的逻辑判定。
条件语句也叫做分支语句,表示了接下来的逻辑可能有几种走向。
1.语法格式
Python中使用if-else关键字表示条件语句。
1.1 if
if something
do_something1
do_something2
next_something
如果条件成立,则执行1、2操作;
如果条件不成立,则不执行1、2操作。
无论条件是否成立,next_something都会执行。
1.2 if-else
if expression:
do_something1
else:
do_something2
如果条件成立,则执行1操作;
如果条件不成立,则执行2操作。
1.3 if-elif-else
if expression1:
do_something1
elif expression2:
do_something2
else:
do_something3
如果条件1成立,则执行1操作;
如果条件1不成立且条件2成立,则执行2操作;
如果条件1、2都不成立,则执行3操作。
注意事项:
-
if 后面的条件表达式,没有(),以:作为结尾;
-
if/else 命中条件后要执行的“语句块”,使用缩进(一般是4个空格或者1个Tab)来表示,而不是 { };
-
对于多条件分支,不是写作else if,而是elif。
-
对于非法情况的判定,也是非常必要的。
示例:
choice = input("输入1表示认真学习,输入2表示躺平摆烂:")
if choice == "1":
print("你能找到好工作")
elif choice == "2":
print("你可能毕业就失业了")
else:
print("您的输入有误")
2.缩进和代码块
a = input("请输入一个整数:")
if a == '1':
print("aaaaa")
print("bbbbb")
# 1 → aaaaa bbbbb
# 2 → bbbbb
-
在Python中,缩进表示代码块。在if,else,elif,while,for......需要跟上代码块的部分,都是需要使用缩进来表示的。在C++/Java中,对于代码缩进是没有强制要求的。
-
Python中的代码块还可以嵌套:当有多级条件嵌套的时候,当前的语句输入哪个代码块,完全取决于缩进的级别。
a = input("请输入第一个整数:") b = input("请输入第二个整数:") if a == '1': print("aaaaa") if b == '2': print("bbbbb") print("ccccc") # 1 2 → aaaaa bbbbb ccccc
3.练习
3.1 判断一个数的奇偶性
a = int(input("请输入一个数字:"))
if a % 2 == 0:
print(f"{a}是偶数")
else:
print(f"{a}是奇数")
这段代码在C++/Java中对于负奇数的判断是不行的(取余2后结果为-1),但Python中可以(取余2后结果为1)。
3.2 判断一个数是正数还是负数
a = int(input("请输入一个整数:"))
if a < 0:
print("负数")
elif a == 0:
print('0')
else:
print("正数")
3.3 判断是否是闰年
a = int(input("请输入一个年份:"))
if (a % 4 == 0 and a % 100 != 0) or (a % 400 == 0):
print(f"{a}年是闰年")
else:
print(f"{a}年是平年")
4.空语句
如果什么都不想做,就写一个 pass 语句占位,不能什么也不写,不然不符合Python语法结构。
a = input()
if a != '1':
pass
else:
print('hello')
八、循环语句
1.while 循环
基本语法格式:
while 条件:
循环体
条件为真,则执行循环体代码。条件为假,则结束循环。
循环三要素:
-
循环变量的初始值
-
循环的判定条件
-
循环变量的更新语句
示例:
# 打印1-10
num = 1
while num <= 10:
print(num)
num += 1
# 计算1-100的和
num = 1
sum = 0
while num <= 100:
sum += num
num += 1
print(sum)# 5050
# 求5的阶乘
num = 5
fac = 1
while num > 0:
fac *= num
num -= 1
print(f"5!={fac}")
# 求1!+2!+3!+4!+5!
num = 1
sum = 0
while num <= 5:
i = 1
fac = 1
while i <= num:
fac *= i
i += 1
sum += fac
num += 1
print(f"1! + 2! + 3! + 4! + 5! = {sum}")# 153
死循环:由于忘记写循环变量的更新语句(如上述num += 1),循环就会一直执行,停不下来了,直到手动强制结束程序。(常用于服务器)
死循环有些时候是bug,有的时候不是bug。
2.for 循环
基本语法格式:
for 循环变量 in 可迭代对象:
循环体
可迭代对象:特殊的变量。内部包含了许多其他的值。
-
range是一个内建函数,起到的效果就是得到一个“可迭代对象”。这个可迭代对象中就包含了一系列的整数。
-
range(beg , end) ==> [beg , end) :前闭后开区间
-
range还提供了第三个参数,表示“步长”,默认的步长是1。
示例:
# 打印1-10
for i in range(1 , 11):
print(i)
# 打印2 4 6 8 10
for i in range(2 , 12 , 2):
print(i)
# 打印10-1
for i in range(10 , 0 , -1):
print(i)
# 计算1+2+3+...+100
sum = 0
for i in range(1 , 101):
sum += i
print(sum)# 5050
# 当前有个问题,sum也是一个内建函数。咱们自己定义的变量和内建函数冲突了,
# 虽然不影响代码运行,但后面无法使用内建函数sum了。
# 此时可以这样解决:
# 光标放在sum上,按shift+F6,改变变量名。
3.continue
continue立即结束本次循环,进入下次循环。
for i in range(1,6):
#发现第3个包子有一只虫子,继续吃下一个包子
if i == 3:
continue
print(f"吃第{i}个包子")
4.break
break立即结束整个循环。
示例1:
for j in range(1,6):
#发现第3个包子有半只虫子,后面也没心思吃了
if j == 3:
break
print(f"吃第{j}个包子")
示例2:让用户输入一些数字,求这些数字的平均值。
theSum = 0
count = 0
while True:
num = input("请输入一个数字(分号表示结束):")
if num == ';':
break
num = float(num)
theSum += num
count += 1
print(f"平均值为{theSum / count}")
# 请输入一个数字(分号表示结束):10.5
# 请输入一个数字(分号表示结束):20.5
# 请输入一个数字(分号表示结束):30.5
# 请输入一个数字(分号表示结束):40.5
# 请输入一个数字(分号表示结束):;
# 平均值为25.5
九、阶段总结(代码案例)
人生重开模拟器
# 人生重开模拟器
import random
import sys
import time
print('+---------------------+')
print(' 花有重开日,人无再少年 ')
print(' 欢迎来到人生重开模拟器 ')
print('+---------------------+')
# 设置初始属性
# 颜值、体质、智力、家境,总和不能超过20,每一项取值都是1-10之间
while True:
print('请设置初始属性(可用点数总数为20)')
face = int(input("请输入颜值(1-10):"))
strong = int(input("请输入体质(1-10):"))
IQ = int(input("请输入智力(1-10):"))
home = int(input("请输入家境(1-10):"))
# 通过条件语句,对用户输入的属性进行校验检查
if face < 1 or face > 10:
print("颜值设置有误!")
continue
if strong < 1 or strong > 10:
print("体质设置有误!")
continue
if IQ < 1 or IQ > 10:
print("智力设置有误!")
continue
if home < 1 or home > 10:
print("家境设置有误!")
continue
if face + strong + IQ + home > 20:
print("总的属性和超过了20,设置有误!")
continue
# 如果上述条件都没有被触发,则认为玩家输入的属性是合法的。
print("初始属性输入完毕!")
print(f"颜值:{face},体质:{strong},智力:{IQ},家境:{home}")
break
point = random.randint(1, 6)
# print(f"point = {point}")
if point % 2 == 1:
gender = 'boy'
print("你是个男孩")
else:
gender = 'girl'
print("你是个女孩")
# 设置角色的出生点
point = random.randint(1, 3)
if home == 10:
# 第一档
print("你出生在帝都,你的父母是高官政要")
home += 1
face += 1
IQ += 1
elif 7 <= home <= 9:
# 第二档
if point == 1:
print("你出生在大城市,父母是公务员")
face += 2
elif point == 2:
print("你出生在大城市,父母是企业高管")
home += 2
else:
print("你出生在大城市,父母是大学教授")
IQ += 2
elif 4 <= home <= 6:
# 第三档
if point == 1:
print("你出生在三线城市,你的父母是医生")
strong += 1
elif point == 2:
print("你出生在镇上,你的父母是老师")
IQ += 1
else:
print("你出生在镇上,你的父母是个体户")
home += 1
else:
# 第四档
if point == 1:
print("你出生在农村,父母是辛苦劳作的农民")
strong += 1
face -= 2
elif point == 2:
print("你出生在穷乡僻壤,你的父母是无业游民")
home -= 1
else:
print("你出生在镇上,你的父母感情不和")
strong -= 1
print(f"颜值:{face},体质:{strong},智力:{IQ},家境:{home}")
# 幼年阶段
for age in range(1, 21):
info = f'你今年{age}岁,'
# 生成一个[1,3]的随机整数
point = random.randint(1,3)
# 编写各种事件的代码
# 性别触发事件
if gender == 'girl' and home <= 3 and point == 1:
info += '你的家里人重男轻女思想非常严重,你被遗弃了!'
print(info)
print('游戏结束!')
sys.exit(0)
# 体质触发事件
# 使用elif是为了一年只能触发一个事件,如果只用if则可能会同时触发多个事件
elif strong < 6 and point < 3:
info += '你生了一场病,'
if home >= 5:
info += '在父母的悉心照顾下,你康复了!'
strong += 1
home -= 1
else:
info += '你的父母没精力管你,你的身体状况更糟糕了!'
strong -= 1
# 颜值触发的事件
elif face <= 4 and age >= 7:
info += '你长得太丑了,别的小朋友不喜欢你。'
if IQ > 5:
info += '你决定用学习填充自己!'
IQ += 1
else:
if gender == 'boy':
info += '你和别的小朋友经常打架!'
strong += 1
IQ -= 1
else:
info += '你经常被别的小朋友欺负!'
strong -= 1
# 智商触发的事件
elif IQ < 5:
info += '你看起来傻傻的。'
if home >= 8 and age >= 6:
info += '你的父母把你送到更好的学校学习。'
IQ += 1
elif 4 <= home <= 7:
if gender == 'boy':
info += '你的父母鼓励你多运动,争取成为运动员。'
strong += 1
else:
info += '你的父母鼓励你多打扮自己。'
face += 1
else:
info += '你的父母为此经常吵架。'
if point == 1:
strong -= 1
elif point == 2:
IQ -= 1
else:
pass
# 健康成长事件
else:
info += '你健康成长。'
if point == 1:
info += '你看起来更结实了。'
strong += 1
elif point == 2:
info += '你看起来更好看了。'
face +=1
else:
# 无事发生
pass
# 打印这一年发生的事情
print(info)
print(f"颜值:{face},体质:{strong},智力:{IQ},家境:{home}")
print('-------------------------------------------------')
# 为了方便观察,加一个小小的暂停操作
time.sleep(2)
欢迎在评论区讨论你的学习心得和疑问!如果你觉得这篇文章对你有帮助,别忘了点赞、收藏和分享哦!
更多推荐
所有评论(0)