Python 简单交互

编程的基本思路就是 IPO。Input 获取数据,Process 逻辑计算,Output 显示结果。要学习pyton首先要明白pthon如何实现人机交互。

1
2
3
4
5
6
7
8
9
10
# 复读机
## 输入你想告诉电脑的话
input_message = input('你想说:')

## 电脑返回相同的话
print('电脑说:', input_message)
## 或者
print('电脑说:'+input_message)
## 或者
print('电脑说:{}'.format(input_message))

感受 Python 中的内存,变量

接下来我们需要知道我们的python是怎样处理数据的。首先我们需要把数据储存在内存中开辟的一个空间中。然后我们用一个 变量 指向这个数据存储的位置。修改的时候只需要把变量中的位置信息改成新的数据,然后python会自动释放原来数据所在位置的内存空间。注:变量是关联一个对象的标识符。

1
2
3
4
5
6
# 创建变量
name_of_hunan ='湖南'
name_of_hubei='湖北'
# 修改变量
name_of_hunan='湖南省'
name_of_hunan=name_of_hubei

理解上面这段代码最好方法就是构造 内存图

引用计数 技术,每一个数据有一个计数,记录的是和它关联的变量的数量。如果没有关联变量了,也就是计数等于0了,数据就会被销毁,内存空间被释放。del 关键字就是用来删除变量的,形象一点就是上图中的小叉叉。

引用计数计数存在问题。对于循环引用的数据(我指向你,你指向我),引用计数无法归零,内存无法被释放。

解决方案(Python内存回收机制):

  • 标记清除:全盘扫描引用计数非零的数据,检查是否存在不使用的数据。如果有类似循环引用的数据,那么做出标记。
  • 分代回收:将内存空间从小到达分为0、1、2三代,如果前代内存满了,触发标记清除,然后把有用的数据升代。如果老年代的内存满了,那只能触发全盘标记清除,但是很难填满老年代的空间。

如何减少内存使用:

  • 尽量减少垃圾:编程的时候尽量控制内存使用。
  • 对象池:每次创建新数据的时候,都先判断池中是否已经存在,如果已经存在相同数据,直接返回对象,如果没有则新建。
  • 配置垃圾回收器:可以修改垃圾回收机制,像是配置垃圾回收时机。
1
2
3
# '湖南' '湖南省' 两个字符串的计数已经是0,已经被销毁
del name_of_hunan # '湖北' 这个字符串数据的计数减小为1
del name_of_hubei # '湖北' 这个字符串数据的计数减小为0,被销毁

变量给变量,传递的是变量中的地址,变化的是对应数据的引用计数。

空间并不是直接就被释放了,如果内存满了,再释放。

管理 Python 中的类型

关于python的类型,python的变量是没有类型的,但是变量指向的那些个数据是有类型的。如果没有准确的变量名称,很容易搞混变量指向的数据的类型。所以命名的时候要注意名称的意义。

类型 举例
字符串 str ‘你好’ 或者 “你好”
整形 int 12、123、3242
浮点型 float 1.232、2.、3.1415
布尔 bool True、False

类型转换 是把一个类型的数据根据规则转换成另一个类型的过程。语法是结果=待转类型(待转数据)举例int('8')返回的是整形8。需要注意的是转换规则是要记住的,像是向下取整这类的规则,和过去在数学中的四舍五入的思想有差异的。

字面值 就是如何写一个数据。

  1. int 类型的字面值:十进制(0 ~ 9)、二进制(使用 0b 修饰一个数字,0 ~ 1)、八进制(使用 0o 修饰一个数字,0 ~ 8)、十六进制(使用0x修饰一个数字,0 ~ 9 a ~ f)。
  2. float 类型的字面值:小数、科学计数法(12e-1 == 1.2)。
  3. str 类型的字面值:’ ‘、" “、”"" “”"(可见即所得)、’’’ ‘’’。引号冲突的时候可以换着用。

类型标注技术:为了解决python语言变量没有类型,导致参数或返回值类型未知,进而导致pycharm编程环境无法给出提升的问题,我们引入了类型标注技术,一种注释。

1
2
3
4
5
6
7
8
9
10
11
12
# 常用的types标注
from types import ···

# 标记参数/变量
变量: 类名

# 标记返回值
def 函数名() -> 类名:
···

# 标注实例变量
self.实例变量 = 参数 # type: 类名

基本数据处理,也就是计算

接下来是python中的数学 运算符 :加+、减-、乘*、小数除/、整数除//、取余%、幂**。

增强运算符:加等于+=、减等于-=、乘等于*=、小数除等于/=、整数除等于//=、取余等于%=、幂等于**=。a=a+3等价于a+=3

比较运算符返回一个bool类型:>、>=、<、<=、==、!=。

逻辑运算符是处理bool类型的。与and、或or、非not。这里我们有一个短路运算的规则,对于and只要出现了一个False其他的就不看了,直接返回 False

按位与&、按位或|、按位取反~、按位异或^。

这些个运算符的 优先级 不需要刻意去记忆,是符合人的常识的。多练习就好。

python 的流程控制

选择语句,循环语句,跳转语句。

选择语句 可以让代码根据条件,有选择性的执行,使用 if elif else。if 后加判断条件,如果满足就执行,如果不满足就跳过到之后的行。elif 上接 if 或 elif 然后加判断条件,表示 ‘否则如果满足’ 。最后是 else 在 elif 和 if 后面,表示否则。elif 子句可以有0个或多个。else 子句可以有0个或1个,且只能放在if语句的最后。

1
2
3
4
5
6
if 条件1:
语句块1
elif 条件2:
语句块2
else:
语句块3

全部使用 if 的代码是不好的,会拖慢处理速度。elif 和 else 在之前的判断条件已经满足的情况下不会再进行判断和处理,会直接跳过的。

条件表达式 可以把几行的条件语句合并成一行。语法是:变量 = 结果1 if 条件 else 结果2。

真值表达式 是很多程序员很喜欢的一种写法。就是说pyhton语言会自动将非bool类型的转换成bool类型。转换结果为False只有这几个:0、0.0、""、None。

循环语句 是为了让电脑不停的运行一段代码,其中包括 while 循环和 for 循环两种。

1
2
3
4
while 条件:
# 满足条件执行的语句
else:
# 不满足条件执行的语句
1
2
3
4
for 变量列表 in 可迭代对象:
# 语句块1
else:
# 语句块2

可迭代对象 包括列表、生成器,容器类型。range(开始,结束,间隔) 函数就是最常用的整数生成器,他返回一个计数器。开始默认为0,间隔默认为1,可以省略。

else子句可以省略。在循环体内用break跳转语句跳出循环时,else子句不执行。实现了对于循环结束出口的判断。所以如果循环体内没有break,else也没有必要加了。

除了break跳转语句,我们还有一个continue跳转语句,可以实现跳过本次循环,不再运行接下来的代码的功能。continue 可以帮助程序减少 if 的嵌套。

补充

  • python 交换数据不需要借助第三方,a,b=b,a 这样就可以成功交换了。
  • python 中的折行符是 \,允许把一行代码拆成好多行。
  • 学会代码调试是程序员的必要能力。调试是让程序中断,逐句审查程序执行过程以及变量取值的操作z。
  • 月份公式:28 + (month + month // 8) % 2 + 2 % month + 2 * 1 // month

小贴士

  1. 在不知道怎么写的时候先不要开始敲代码,可以先把思路写下来。
  2. 有什么问题及时上网查找教程。w3cschool、菜鸟教程 之类的。
  3. 画图永远是最好的整理思维的方法。
  4. 在编程的时候经常思考如何节省内存,会对学习python有帮助。