目录
[1.1 表达式](#1.1 表达式)
[1.2 变量](#1.2 变量)
[1.3 动态类型特性](#1.3 动态类型特性)
[1.4 输入](#1.4 输入)
[2.1 算术运算符](#2.1 算术运算符)
[2.2 关系运算符](#2.2 关系运算符)
[2.3 逻辑运算符](#2.3 逻辑运算符)
[2.4 赋值运算符](#2.4 赋值运算符)
[2.5 练习](#2.5 练习)
[3.1 条件语句](#3.1 条件语句)
[3.2 while循环](#3.2 while循环)
[3.3 for循环](#3.3 for循环)
[4.1 设置初始属性](#4.1 设置初始属性)
[4.2 设置性别](#4.2 设置性别)
[4.3 设置出生点](#4.3 设置出生点)
[4.4 生成人生经历](#4.4 生成人生经历)
[4.5 完整代码](#4.5 完整代码)
注:本系列是建立在已经完成C/C++ 的语法基础学习上的,所以只快速展示 Python 基本语法,基本看一遍就懂
一,表达式和常量和变量
1.1 表达式
我们可以把 Python 当场一个计算器来进行一些算术运算:
python
print(1 + 2 - 3)
print(1 + 2 * 3)
print(1 + 2 / 3)
- 形如 1 + 2 - 3 这样的算式,在编程语言中称为表达式 ;算式的运算结果称为表达式的返回值
- 其中 1,2,3 这种称为 字面值常量,+ - * / 这种称为 运算符 或者 操作符。
- 第三个打印结果最后是665,为什么不是667呢?第三个结果我们称为浮点数,规则为 IEEE754 标准,在这套规则下,在内存中表示浮点数的时候, 可能会存在微小的误差
示例:给定四个分数, 67.5, 89.0, 12.9, 32.2 , 编写代码, 求这四个分数的平均数
python
print( (67.5 + 89.0 + 12.9 + 32.2) / 4 )
1.2 变量
Python 的变量在定义时,前面不带类型,直接就是:
python
a = 10
类似与C++定义变量时前面自带了auto,然后又把auto隐藏掉了;Python 的变量也遵守变量定义的基本规则
可以直接用print打印变量的值,也可以打印变量的类型:
python
a = 10
b = 0.5
c = 'hello'
print(a)
print(b)
print(c)
print(type(a))
print(type(b))
print(type(c))
除了上述类型之外,Python 中还有 bool,list,tuple,dict,自定义类型等等,我们后续再介绍
1.3 动态类型特性
在 Python 中,一个变量是什么类型,是可以在 "程序运行" 过程中发生变化的,这个特性称为 "动态类型" ,如下代码:
python
a = 10
print(f'a = {a}, type(a) = {type(a)}')
# 直接在代码中对a进行跨类型赋值
a = 'hello'
print(f'a = {a}, type(a) = {type(a)}')
- C++/Java 这样的语言则不允许这样的操作,一个变量定义后类型就是固定的了,这种特性则称为 "静态类型"
- 所以"动态特性"是Python 特有的
1.4 输入
C有scanf读取用户从键盘输入的值,C++有cin等,那么Python也有读取键盘输入数据的方法如下图:
python
a = input('请输入第一个数:')
b = input('请输入第二个数:')
print(f'a = {a}, type(a) = {type(a)}')
print(f'a = {b}, type(a) = {type(b)}')
#注意,在Python中,读取到的键盘输入的值是字符串类型,要对数字进行计算需要转化下类型
a = int(a)
b = int(b)
print(f'a + b = {a + b}')
二,运算符
2.1 算术运算符
①首先是最基础的加减乘除取模:
python
print(10 + 20) #加法
print(10 - 20) #减法
print(10 * 20) #乘法
print(10 / 20) #除法
print(10 % 20) #取模
② 求乘方
在 C/C++中,求乘方操作一般由库函数来完成,但是Python针对求乘方设计了专门的运算符:
cpp
print(4 ** 2) #求4的2次方
print(4 ** 0.5) #也可以算小数次方
③取整除法
整数除以整数,但是舍弃掉小数部分并向下取整,注意,是舍弃小数,不是四舍五入:
cpp
print(7 // 2) #结果为3.5,舍弃小数,结果为3
print(-7 // 2) #结果为-3.5,舍弃小数并向下取整,结果为-4
2.2 关系运算符
这个就是和 C/C++一样了,如下代码:
python
a = 10
b = 20
print(a < b)
print(a <= b)
print(a > b)
print(a >= b)
print(a == b)
print(a != b)
在 Python 中还可以对两个字符串进行大小比较,比较规则是"字典序"
2.3 逻辑运算符
这个也基本和 C/C++ 一样,就是"逻辑或","逻辑与","逻辑取反",如下代码:
python
a = True
b = False
print(a and b) #逻辑与,有一个假,结果为假
print(a or b) #逻辑或,有一个真,结果为真
print(not a) #逻辑取反
print(not b)
和其他编程语言类似,Python 也存在短路求值的规则:
- 对于 and,如果左侧表达式为 False,则整体一定为 False,右侧表达式不再执行
- 对于 or,如果左侧表达式为 True,则整体一定为 True,右侧表达式不再执行
2.4 赋值运算符
这个也是 C/C++ 一样的,如下代码:
python
a = b = 10 #链式赋值
a, b = 10, 20 #多元赋值
a = 10
b = 20
a, b = b, a #也是多元赋值
a += 10 #等价于 a = a + 1,其它复合赋值运算符也是同理
a -= 10
a *= 10
a /= 10
a %= 10
注意:
- 像 C++ / Java 中,存在 ++ -- 这样的 自增/自减 运算符;但Python 中则不支持这种运算,如果需要使用,直接使用 += 1 或者 -= 1
- 除了上述之外,Python 中还有一些运算符,比如 身份运算符 (is,is not),成员运算符 (in,not in),位运算符 ( & | ~ ^ >) 等。
2.5 练习
(1) [多选] 以下关于变量之间加法运算的说法, 正确的是:
A. Python 中的字符串之间够能相加.
B. Python 中的字符串可以和整数相加.
C. Python 中的整数可以和浮点数相加.
D. Python 中的整数可以和布尔值相加.
解答:答案是A C D。如果把布尔类型和整数进行运算,就会把 True 当作1,把 False 当作0
(2) [单选] 以下关于类型的说法, 正确的是:A. Python 中既有字符串类型, 也有字符类型.
B. Python 中既有 float, 也有 double.
C. Python 中既有 int, 也有 long
D. Python 中的整数表示范围无上限.
解答:答案是 D。Python 只有字符串类型没有字符类型;只有 float 没有 double;只有 int 没有 long
(3) [单选] 以下 Python 代码, 合法的是A. int a = 10
B. a = 10;
C. a = true
D. a = 'aaa' + 10
解答:答案为 B。Python创建变量时不需要指定类型,如果要指定类型,要这样"a:int = 10"; 在 Python 中,分号是可有可无的; true 需要首字母大写;Python 中字符串和整数不能运算
三,语句
3.1 条件语句
- if 后面的条件表达式, 没有 ( ), 使用 : 作为结尾.
- if / else 命中条件后要执行的 "语句块", 使用 缩进 (通常是 4 个空格或者 1 个 tab)来表示, 而不是 { }
- 对于多条件分支, 不是写作 else if, 而是 elif (合体了).
python
a = int(input("输入一个数:"))
if a > 0:
print('输入的数是正数')
elif a < 0:
print('输入的数是负数')
else:
pass #pass表示空语句
3.2 while循环
计算 1 - 100 所有数的和:
python
sum = 0
num = 1
while num <= 100:
sum += num
num += 1
print(sum)
计算5的阶乘:
python
result = 1
n = 1
while n <= 5:
result *= n
n += 1
print(result)
其余规则和 C/C++ 一直,while里面也可以嵌套 while
3.3 for循环
对于for循环,Python 的使用方法和 C/C++ 很不相同,基本语法格式为:
python
for 循环变量 in 可迭代对象:
循环体
所谓的 "可迭代对象",指的是 "内部包含多个元素,能一个一个把元素取出来的特殊变量",下面我们通过多个示例来熟悉 Python 的 for 循环的使用:
打印 1-10
python
#使用 range 函数,生成一个可迭代对象,范围是[1, 11),也就是[1, 10]
for i in range(1, 11):
print(i)
这个有点类似 C++11 中的范围for
打印 2,4,6,8,10
python
#range 的第三个参数可以指定迭代时候的 "步长". 也就是一次让循环变量加几.
for i in range(2, 12, 2):
print(i)
从10开始打印到1
cpp
# 步长也可以设置为负数
for i in range(10, 0, -1):
print(i)
计算1-100 所有数字的和
python
sum = 0
for i in range(1, 101):
sum += i
print(sum)
循环语句的 continue 和break用法和C/C++是一模一样的,这里不再赘述
四,实践
下面我们来搞一个"人生重开模拟器"
4.1 设置初始属性
在游戏中我们设定四个属性:颜值 (face) 体质 (strong) 智力 (iq) 家境 (home)
我们约定每个属性的范围为 [1, 10], 并且总和不能超过 20;如果玩家输入的初始属性不合理, 就提示输入有误, 重新输入:
python
print("+---------------------------------------------------------------------+")
print("| |")
print("| 花有重开日, 人无再少年 |")
print("| |")
print("| 欢迎来到, 人生重开模拟器 |")
print("| |")
print("+---------------------------------------------------------------------+")
# 设置初始属性
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("初始属性设定完成!")
break
4.2 设置性别
- 通过 random.randint(1, 6) 生成一个 [1, 6] 的随机整数, 类似于掷色子.
- 如果是单数, 则性别设为男孩
- 如果是双数, 则性别设为女孩.
- 男孩和女孩会遇到不同的事件.
python
#设置性别
point = random.randint(1, 6) # 掷色子
if point % 2 == 1:
gender = 'boy'
print("你是个男孩")
else:
gender = 'girl'
print("你是个女孩")
4.3 设置出生点
首先按照家境(home), 分成四个档位.:
- 10 是第一档. 加成最高
- [7, 9] 是第二档. 也有一些加成
- [4, 6] 是第三档. 加成较少
- [1, 3] 是第四档. 会扣掉属性.
再扔一次色子, 生成 [1, 3] 的随机数, 用来表示每一种细分情况
python
#设置出生点
point = random.randint(1, 3) # 掷色子
if home == 10:
print('你出生在帝都, 你的父母是高官政要')
home += 1
iq += 1
face += 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('你出生在三线城市, 你的父母是教师')
iq += 1
elif point == 2:
print('你出生在镇上, 你的父母是医生')
strong += 1
else:
print("你出生在镇上, 你的父母是个体户")
home += 1
else:
if 1 <= point <= 2:
print('你出生在村里, 你的父母是辛苦劳作的农民')
strong += 1
face -= 2
elif 3 <= point <= 4:
print('你出生在穷乡僻壤, 你的父母是无业游民')
home -= 1
else:
print('你出生在镇上, 你父母感情不和')
strong -= 1
4.4 生成人生经历
按照年龄, 把人生经历分成四个阶段:
- 幼年阶段 [1, 10]
- 青年阶段 [11, 20]
- 壮年阶段 [20, 50]
- 老年阶段 50 岁以上.
每个阶段都会有不同的精力和事件发生:
- 幼年阶段可塑性强, 体质, 颜值, 智力都会有较快变化
- 青年阶段主要是求学, 同时父母一辈会有明显变化, 智力和家境会有明显变化
- 壮年阶段相对平稳, 属性变化不大, 主要是一些随机事件影响到属性
- 老年阶段体质, 颜值, 智力都会显著退化, 并且随着年龄的上升, 疾病/死亡的风险逐渐升高
此处我们以幼年为例, 简单实现一下这里的处理逻辑:
- 使用 for 循环, 按照年龄循环起来.
- 针对每一年, 先掷一次 [1, 3] 的色子, 根据不同的随机数值, 来触发不同的事件.
- 根据性别, 年龄, 各种属性, 来触发不同的事件,这里都使用 if - else 的方式来组织.
- 不同的事件可能会对属性有正面/负面的影响. 在每一年的最后, 打印这一年遇到的事情.
- 如果夭折, 则直接 sys.exit(0) 退出程序.
- 使用 time.sleep(1) 使程序暂停执行 1s, 方便观察程序结果.
python
#生成人生经历,这里以幼年为例
for age in range(1, 11):
info = f'你今年 {age} 岁, '
point = random.randint(1, 3)
# 性别触发事件
if gender == 'girl' and home <= 3 and point == 1:
info += '你家里人重男轻女思想非常严重, 你被遗弃了!'
print(info)
print("游戏结束!")
sys.exit(0)
# 体质触发的事件
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 += '你和别的小朋友经常打架'
iq -= 1
strong += 1
else:
info += '你经常被别的小朋友欺负'
strong -= 1
# 智商触发的事件
elif iq < 5:
info += '你看起来傻傻的, '
if home >= 8 and age >= 6:
info += '你的父母给你送到更好的学校学习'
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:
info += '你健康成长, '
if point == 1:
info += '看起来更聪明了'
iq += 1
elif point == 2:
info += '看起来更好看了'
face += 1
else:
info += '看起来更结实了'
strong += 1
print('-------------------------------------------')
print(info)
print(f'strong={strong}, face={face}, iq={iq}, home={home}')
time.sleep(1)
4.5 完整代码
python
import random
import sys
import time
print("+---------------------------------------------------------------------+")
print("| |")
print("| 花有重开日, 人无再少年 |")
print("| |")
print("| 欢迎来到, 人生重开模拟器 |")
print("| |")
print("+---------------------------------------------------------------------+")
# 设置初始属性
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("初始属性设定完成!")
break
#设置性别
point = random.randint(1, 6) # 掷色子
if point % 2 == 1:
gender = 'boy'
print("你是个男孩")
else:
gender = 'girl'
print("你是个女孩")
#设置出生点
point = random.randint(1, 3) # 掷色子
if home == 10:
print('你出生在帝都, 你的父母是高官政要')
home += 1
iq += 1
face += 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('你出生在三线城市, 你的父母是教师')
iq += 1
elif point == 2:
print('你出生在镇上, 你的父母是医生')
strong += 1
else:
print("你出生在镇上, 你的父母是个体户")
home += 1
else:
if 1 <= point <= 2:
print('你出生在村里, 你的父母是辛苦劳作的农民')
strong += 1
face -= 2
elif 3 <= point <= 4:
print('你出生在穷乡僻壤, 你的父母是无业游民')
home -= 1
else:
print('你出生在镇上, 你父母感情不和')
strong -= 1
#生成人生经历,这里以幼年为例
for age in range(1, 11):
info = f'你今年 {age} 岁, '
point = random.randint(1, 3)
# 性别触发事件
if gender == 'girl' and home <= 3 and point == 1:
info += '你家里人重男轻女思想非常严重, 你被遗弃了!'
print(info)
print("游戏结束!")
sys.exit(0)
# 体质触发的事件
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 += '你和别的小朋友经常打架'
iq -= 1
strong += 1
else:
info += '你经常被别的小朋友欺负'
strong -= 1
# 智商触发的事件
elif iq < 5:
info += '你看起来傻傻的, '
if home >= 8 and age >= 6:
info += '你的父母给你送到更好的学校学习'
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:
info += '你健康成长, '
if point == 1:
info += '看起来更聪明了'
iq += 1
elif point == 2:
info += '看起来更好看了'
face += 1
else:
info += '看起来更结实了'
strong += 1
print('-------------------------------------------')
print(info)
print(f'strong={strong}, face={face}, iq={iq}, home={home}')
time.sleep(1)