速通Python 第二节
一、动态类型特性
在
Python
中
,
一个变量是什么类型
,
是可以在
"
程序运行
"
过程中发生变化的
.
这个特性称为
"
动态类型
"
a = 10
print(type(a))
a = 'hello'
print(type(a)
在程序执行过程中, a 的类型刚开始是 int, 后面变成了 str.
C++/Java
这样的语言则不允许这样的操作
.
一个变量定义后类型就是固定的了
.
这种特性则称为
"
静
态类型
".
动态类型特性是一把双刃剑
.
对于中小型程序
,
可以大大的解约代码量
(
比如写一段代码就可以同时支持多种类型
).
对于大型程序
,
则提高了模块之间的交互成本
. (
程序猿
A
提供的代码难以被
B
理解
)
二、注释
注释是一种特殊的代码
,
它不会影响到程序的执行
,
但是能够起到解释说明的作用
,
能够帮助程序猿们理解程序代码的执行逻辑
from turtle import *
speed(10)
# 外层大七巧板
fillcolor( 'green') #蓝色三角
begin_fill()
left(45)
forward(400)
left(135)
forward(400*(2**(1/2)))
home()
end_fill()
fillcolor( 'blue') #绿色三角
begin_fill()
left(135)
forward(400)
left(135)
forward(400*(2**(1/2)))
home()
end_fill()
fillcolor( 'yellow') #黄色三角
begin_fill()
left(45)
forward(200)
right(135)
forward(200*(2**(1/2)))
home()
end_fill()
fillcolor( 'purple') #紫色正方形
begin_fill()
right(45)
for i in range(4):
forward(200)
right(90)
home()
end_fill()
left(45) #红色平行四边形
forward(400)
fillcolor( 'red')
begin_fill()
right(135)
forward(200*(2**(1/2)))
right(45)
forward(200)
right(135)
forward(200*(2**(1/2)))
end_fill()
home()
left(45) #棕色三角
forward(400)
right(135)
fillcolor( 'brown')
forward(200*(2**(1/2)))
begin_fill()
forward(200*(2**(1/2)))
right(90)
forward(200*(2**(1/2)))
right(135)
forward(200)
end_fill()
home()
right(135) #粉色三角
forward(400)
left(135)
fillcolor( 'pink')
begin_fill()
forward(200*(2**(1/2)))
left(135)
forward(200)
end_fill()
home()
如上,这是一个画七巧板的代码,注释帮助我们区分每个部分的代码。
注释的语法
Python
中有两种风格的注释
.
(1) 注释行
使用
#
开头的行都是注释
.
#注释的第一种方法
(2) 文档字符串
使用三引号引起来的称为
"
文档字
- 可以包含多行内容,
- 一般放在 文件/函数/类 的开头.
- """ 或者 ''' 均可 (等价).
"""
文档字符串
文档字符串
"""
注释的要求
1.
内容准确
:
注释内容要和代码一致
,
匹配
,
并在代码修改时及时更新
.
2.
篇幅合理
:
注释既不应该太精简
,
也不应该长篇大论
.
3.
使用中文
:
中国一般都要求使用中文写注释
,
三、输入输出
程序需要和用户进行交互.
用户把信息传递给程序的过程, 称为 "输入".
程序把结果展示给用户的过程, 称为 "输出".
输入输出的最基本的方法就是控制台. 用户通过控制台输入一些字符串, 程序再通过控制台打印出一些字符串.
PyCharm
运行程序, 下方弹出的窗口就可以视为是控制台
输入输出的最常见方法是图形化界面
.
如我们平时用到的
QQ,
浏览器
, steam
等
,
都不需要用户输入命令
, 而只是通过鼠标点击窗口点击按钮的方式来操作.
Python 当然也可以用来开发图形化界面的程序. 但是图形化程序开发本身是个课题,我们这里不做介绍。
1.通过控制台输出
Python通过print输出
我们可以用print输出一个字符串
print('hello')
它不仅能输出一个字符串
,
还可以输出一个其他类型的变量
a = 10
print(a)
b = True
print(b)
更多的时候
,
我们希望能够输出的内容是混合了字符串和变量的
.
例如
:
输出
num = 1000
这种情况我们要这么写
num = 1000
print(f'num = {num}')
注意
:
- 使用 f 作为前缀的字符串, 称为 f-string
- 里面可以使用 { } 来内嵌一个其他的变量/表达式
2.通过控制台输入
python
使用
input
函数
,
从控制台读取用户的输入
.
num = 0num = input ( ' 请输入一个整数 : ' )print ( f' 你输入的整数是 { num } ' )
注意
:
- input 的参数相当于一个 "提示信息", 也可以没有.
- input 的返回值就是用户输入的内容. 是字符串类型.
下面我们来看这个代码
a = input('请输入第一个整数: ')
b = input('请输入第二个整数: ')
print(f'a + b = {a + b}')
我们来试试这个代码
此处的结果是字符串拼接, 不是算术运算. 如果要想进行算术运算, 需要先转换类型.
a = input('请输入第一个整数: ')
b = input('请输入第二个整数: ')
a = int(a)
b = int(b)
print(f'a + b = {a + b}')
通过 int( ) 把变量转成了 int 类型.
类似的, 使用 float( ), bool( ), str( ) 等可以完成对应的类型转换
代码示例
:
输入
4
个小数
,
求
4
个小数的平均值
.
a = input('请输入第一个数字: ')
b = input('请输入第二个数字: ')
c = input('请输入第三个数字: ')
d = input('请输入第四个数字: ')
a = float(a)
b = float(b)
c = float(c)
d = float(d)
avg = (a + b + c + d) / 4
print(f'平均值: {avg}')
四、运算符
1.算术运算符
像
+
-
* / % ** //
这种进行算术运算的运算符
,
称为
算术运算符
注意
1
: /
中不能用
0
作为除数
.
否则会
抛出异常
print(10 / 0)
注意
2:
整数
/
整数 结果可能是小数
.
而不会截断
print(10 / 3)
注意
3:
%
不是
"
百分数
",
而是求余数
print(7 % 2)
注意
4: **
是求乘方
.
不光能算整数次方
,
还能算小数次方
print(4 ** 2)
print(4 ** 0.5)
注意
5:
//
是取整除法
(
也叫地板除
).
整数除以整数
,
结果还是整数
(
舍弃小数部分
,
并向下取整
.
不是四舍五入)
print(7 // 2)
print(-7 // 2)
2.关系运算符
像 < <= > >= == != 这一系列的运算符称为 关系运算符 , 它们是在比较操作数之间的关系 .其中<= 是 " 小于等于 ">= 是 " 大于等于 "== 是 " 等于 "!= 是 " 不等于 "
(1)
如果关系符合
,
则表达式返回
True.
如果关系不符合
,
则表达式返回
False
a = 10
b = 20
print(a < b)
print(a <= b)
print(a > b)
print(a >= b)
print(a == b)
print(a != b)
(2)
关系运算符不光针对整数
/
浮点数进行比较
,
还能针对字符串进行比较
.
a = 'hello'
b = 'world'
print(a < b)
print(a <= b)
print(a > b)
print(a >= b)
print(a == b)
print(a != b)
注意
:
直接使用 == 或者 != 即可对字符串内容判定相等 . ( 这一点和 C / Java 不同 ).字符串比较大小 , 规则是 " 字典序 "
关于字典序:
想象一个英文词典, 上面的单词都是按照字母顺序排列. 如果首个字母相同, 就比较第二个字母. (就
比如著名单词 abandon).
我们认为一个单词在词典上越靠前, 就越小. 越靠后, 就越大.
(3) 对于浮点数来说, 不要使用 == 判定相等.
print(0.1 + 0.2 == 0.3)
注意
:
浮点数在计算机中的表示并不是精确的
!
在计算过程中
,
就容易出现非常小的误差
.
print(0.1)
print(0.2)
print(0.3)
print(0.1 + 0.2)
可以看到
,
0.1 + 0.2
的结果并非是
0.3
,
而是带了个小尾巴
.
虽然这个尾巴非常小了
,
但是
==
是锱铢
必较的
,
仍然会导致
==
的结果为
False.
不止是 Python 如此, 主流编程语言都是如此. 这个是 IEEE754 标准规定的浮点数格式所引入的问
题. 此处我们不做过多讨论
正确的比较方式
:
不再严格比较相等了
,
而是判定差值小于允许的误差范围
a = 0.1 + 0.2b = 0.3print ( - 0.000001 < ( a - b ) < 0.000001 )
实际工程实践中, 误差在所难免, 只要保证误差在合理范围内即可
3.逻辑运算符
像 and or not 这一系列的运算符称为 逻辑运算符.print(10 > 20 and 10 / 0 == 1) print(10 < 20 or 10 / 0 == 1)
and 并且. 两侧操作数均为 True, 最终结果为 True. 否则为 False. (一假则假)or 或者. 两侧操作数均为 False, 最终结果为 False. 否则为 True. (一真则真)not 逻辑取反. 操作数本身为 True, 则返回 False. 本身为 False, 则返回 True.此处说的 "并且" 和 "或者", 就是我们日常生活中使用的 "并且" 和 "或者".想象一下未来丈母娘问你要彩礼, 什么叫做 "有房并且有车", 什么叫做 "有房或者有车" .
a = 10
b = 20
c = 30
print(a < b and b < c)
print(a < b and b > c)
print(a > b or b > c)
print(a < b or b > c)
print(not a < b)
print(not a > b)
一种特殊写法
a < b and b < c
这个操作等价于
a < b < c
.
这个设定和大部分编程语言都不相同
关于短路求值
和其他编程语言类似
, Python
也存在短路求值的规则
.
- 对于 and, 如果左侧表达式为 False, 则整体一定为 False, 右侧表达式不再执行.
- 对于 or, 如果左侧表达式为 True, 则整体一定为 True, 右侧表达式不再执行.
4.赋值运算符
(1)
=
的使用
=
表示赋值
.
这个我们已经用过很多次了
.
注意和
==
区分
.
=
除了基本的用法之外
,
还可以同时针对多个变量进行赋值
.
链式赋值
a = b = 10
多元赋值
a, b = 10, 20
代码实例
:
交换两个变量
基础写法
a = 10
b = 20
tmp = a
a = b
b = tmp
基于多元赋值
a = 10
b = 20
a, b = b, a
(2)
复合赋值运算符
Python
还有一些
复合赋值运算符
.
例如
+=
-
= *= /= %=
其中
a += 1
等价于
a = a + 1
.
其他复合赋值运算符也是同理
.
a = 10
a = a + 1
print(a)
b = 10
b += 1
print(b)
注意: 像 C++ / Java 中, 存在 ++ -- 这样的自增/自减运算符. Python 中则不支持这种运算. 如果需要使用, 则直接使用 += 1 或者 -= 1
++ -- 最大的问题就是容易分不清前置和后置的区别. 这一点 Python 语法在设计的时候就进行了
规避, 避免出现这种不直观, 并且容易混淆的语法.
除了上述之外
, Python
中还有一些运算符
,
比如
身份运算符
(is, is not),
成员运算符
(in, not in),
位运算符 ( & | ~ ^ << >>) 等
. 此处咱们暂时不介绍.