对于初学者,基础语法是第一关,也是最枯燥的一关,我的学习建议是:先“够用”,再“深造”。

Python每年都会发布一个大版本,增加一些新语法、新特性。但这些新内容,也许你很长一段时间内都不会用到。把时间精力聚焦在最常用的80%,尽快投入实践应用,在实践中盘旋成长,这才是入门的意义。

先看我画的一张图,标出了Python基础学习的知识点,几乎涵盖本课程80%内容。后续课程,也会围绕图中知识点展开讲解,建议收藏作为参考。
image.png

本文学习内容如下:

  1. 变量及命名:关键概念理解
  2. 赋值和计算:基本表达式
  3. 输入和输出:基本应用模式
  4. 如何排查错误和找答案
  5. 常见错误类型

在开始之前,先明确几个入门必懂的概念:代码、程序文件、解释器、运行时

  • 代码,Code,就是你编写的那些Python语句;
  • 它没有运行的时候,被你保存在某个程序文件
  • 当你想运行代码时,就得先运行解释器,它的名字叫python(在上一节中你已装好了);
  • 在脚本模式下,用python abc.py这样的命令执行代码;
  • 这时,你的Code开始被运行,Code中那些变量开始占用你的电脑内存
  • Code执行完毕后,脚本模式下解释器也跟着关闭,你电脑的内存被释放。
  • 如果还想运行Code,再执行一次python abc.py命令即可,占用重新分配的内存空间。

1、变量及命名

变量是计算机编程中最基础的一个概念。
它的主要意义是:让你找到计算机给你程序分配的内存
所以,编程中的变量本质,就是一个内存地址。
我们所选的官方Python版本中,可以通过id()内置函数,获得其地址。
那每个数据分配多少内存呢?这取决于数据的类型。
作为选择Python入门的福利包之一,就是你可以不用管内存怎么分。

如果非要Hack研究: 可以用sys标准模块的getsizeof查看数据类型内存分配 如果还不满足,那就下载官方Python源码研究去吧

你只需知道,Python里有这么几个基本数据类型:
整数(int)、浮点数(float)、字符串(str)、逻辑值(bool
这四个是最常用的数据类型,请务必记住,还有如复数(complex)暂时不用理会。
这几个数据类型的数据,都是“不可变”的,什么意思呢?
就是这些数据生成后,本身不能被改变,因为分配的内存已经固定。
相比这些基本数据,下一节我们会讲数据结构,那里有”可变“的数据让你对比理解。

因为不需要理会内存分配,所以在定义Python变量时,不需要制定类型,只要在用之前有声明即可。
如果提前用了没声明过的变量,就会出现not defined提示。
既然变量不用指定类型,我们怎么知道它是什么类型呢?
介绍2个内置函数type()isinstance(),它用来判断对象的数据类型。

  1. x = 1
  2. type(x) # 返回<class 'int'>
  3. isinstance(x,int) # 测试x是否是int,返回True

变量起名字也有规范:

  • 可以是字母、数字、下划线的组合
  • 第一个字符不能是数字
  • 字母区分大小写,如aA是两个不同变量
  • 不能用Python保留的关键词

虽然看起来起名字很多选择,但我建议你从开始就养成习惯,可以少出错,更容易理解。
比如最基本的:

  • 用有意义的词,如果太长可以截一部分作为缩写,如score
  • 如果有多个意义的词,中间加下划线,如school_name
  • 变量字母尽量全小写,如total
  • 常量字母全部大写,如MAX_LEN

2、赋值和计算

理解了变量,我们就可以用它”装载“数据,进而计算。
这里虽然用了“装载”一词,但你要记住,变量本质是指向了数据的内存位置,是一个地址。
只不过,我们在日常使用中,很理所当然地把它当成了一个“数据容器”。
我们用赋值操作为变量“装载”数据。

2.1 整数和浮点数

  1. x = 1 # 整数
  2. x = 3.14 # 浮点数
  3. x = 'Hello' # 字符串
  4. x = True # 布尔值

整数和浮点数很容易理解,和我们学过的数学一致。

2.2 字符串

字符串可以用单'x'、双"x"、三引号"""x""",常见的用法有2个:

  1. 如果遇到“话中话”,双引号放里面,单引号放外面。
  1. s = 'I know that "A" and "a" are two different variables.'
  1. 整块的代码注释,可以用三引号
  1. """
  2. 注释是写给人看的
  3. 方便了解代码意义
  4. 程序运行时会跳过
  5. """
  6. s = 'abc' # 单行注释也可以用一个#符号

字符串操作主要包括:分割、连接、切片、查找、替换、大小写转换、首位去空格、格式化

你不必马上记住,可以练习一下,后面用到的时候再过来查找。

  1. s = 'Hello Python, hi yichu.'
  2. # 分割,按逗号分成两部分,返回一个list(下一节会讲数据结构)
  3. ss = s.split(',')
  4. # 连接,用join把两部分连接起来
  5. # 加号操作在字符量大情况下效率低
  6. # 还有其他连接方式,先记住这两个
  7. s1 = ','.join(ss)
  8. s2 = 'abc' + 'def'
  9. s3, s4 = 'abc', 'def' # 多变量赋值
  10. # 切片,[下标],下标从0开始
  11. # [start:end]表示从start开始,到end-1结束
  12. # [::-1]表示把字符串反转
  13. # 结果分别是'H', '.', 'Python', '.uhciy ih ,nohtyP olleH'
  14. s[0], s[-1], s[6:12], s[::-1]
  15. # 查找,返回6,如果找不到返回-1
  16. # 其他的参数和查找函数可以用到再查,先记住2个
  17. s.find('P')
  18. s.index('x') # 找不到会报异常
  19. # 替换,返回一个新字符串s3
  20. s.replace('Python', 'vscode')
  21. # 大小写转换
  22. s.upper() # 转大写
  23. s.swapcase() # 大变小,小变大
  24. # 首位去空格
  25. s.strip()
  26. # 格式化
  27. # 优先使用format
  28. s3 = '%s: %s' % ('python', 2020)
  29. s3 = '{}: {}'.format('python', 2020)

2.3 数字运算

相对简单,基本如”加减乘除”:
  1. # 加,结果3
  2. x = 1 + 2
  3. # 减,结果:1.1
  4. y = 3.1 - 2
  5. # 乘,结果72
  6. z = 8 * 9
  7. # 除,结果0.5
  8. a = 2 / 4
  9. # 整除,结果0
  10. b = 2 // 4
  11. # 取余,结果2
  12. c = 20 % 3
  13. # 乘方,4的3次方,结果64
  14. d = 4 ** 3
  15. # 以上操作还可以联合赋值运算一起
  16. x *= 3 # 等价于:x = x * 3
  17. x /= 3 # 等价于:x = x / 3
  18. # 其他同理
  19. x += 1 # Python中不存在x++这样的写法

2.4 逻辑计算

布尔值是逻辑计算的结果,只有TrueFalse两个。

计算过程一般会涉及到比较、判断以及逻辑计算。

  1. # 数值比较
  2. b = 1 > 2 # False
  3. b = 1 >= 0.5 # True
  4. b = 1 <= 0.5 # False
  5. # 逻辑运算
  6. b = 1 > 2 and 1 > 0.5 # False
  7. b = not b # True
  8. b = 1 > 2 or 1 > 0.5 # True
  9. # 字符串比较
  10. b = 'abc' == 'abc' # True
  11. b = 'abc' != "abc" # False
  12. # is 和 in
  13. b = 's' in 'string' # True
  14. b = 's' not in 'string' # False
  15. b = 's' is 's' # True
  16. b = 's' is not 's' # False
  17. c = isinstance(b,bool)) # True

2.5 运算优先级

就像四则运算有先后顺序,Python也有。记不住正常,只要记住一些常见的即可。
实在记不住,可以用小括号加强,因为小括号优先级最高,比如:

  1. x = ((2-1)*(2**2)-3*4)//2 # 结果-4

常见运算符优先级,从最高到最低,排列如下。
image.png

2.6 数据类型转换

最后,讲一下数据类型之间的转换。
整数、浮点数、字符串、布尔值,之间经常需要互转。

  1. x = 100.1
  2. y = int(x) # 结果100
  3. z = float(y) # 结果100.0
  4. x1 = float('100.2') # 结果100.2
  5. x2 = int('100.3') # 结果出错,转换失败
  6. bool(x) # True
  7. bool(0) # False

目前重点掌握上述4类基础数据运算即可。
Python也有提供位计算,等以后需要用了,再看不迟。

此外,字符串处理几乎是使用最频繁的,在查找匹配方面,还有更专业的正则表达式。
但就像一开始说的,“够用即可”,等到用得上,再学不迟,首先掌握基本常用的那80%,能解决问题就够了。

3、输入和输出

输入输出,不仅是人和计算机交互方式,也是程序间数据交换方式。

比如,我们上网,提交表单就是我们向服务器的输入; 服务器处理后返回的网页就是它的输出。 只不过,中间需要经过多层数据转换,会复杂些。

这里,我们主要讲最基本的命令行终端输入输出。
即,在命令行中,我们输入一些数据,经过我们写的代码计算后,用字符形式在终端显示。
最上面那张图里面已经包含了输入输出的2个内置函数:print()input()
学会用print()输出,你就能随时打印变量出来观察:

  1. x = 1 # 整数
  2. print(x) # x值
  3. print(type(x)) # 类型int
  4. print(id(x)) # 内存地址
  5. x = 3.14 # 浮点数,表示有小数,类型float
  6. print(x)
  7. print(type(x))
  8. print(id(x))
  9. x = 'Hello' # 字符串,类型str
  10. print(x)
  11. print(type(x))
  12. print(id(x))
  13. x = True # 布尔值,代表逻辑判断的"真"和"假",类型bool
  14. print(x)
  15. print(type(x))
  16. print(id(x))
  17. s = 'hello'
  18. print(id(s)) # 留意和最下面的对比
  19. s += 'world'
  20. print(s)
  21. print(id(s)) # 留个思考题:为什么地址变了

当然,你也可以用上一节介绍的VSCode中Python数据查看器观察。

接着我们设计一个最简单的输入输出:

  1. x = input('请输入一个整数:') # 等待输入
  2. print(type(x)) # 输出收到内容的类型

如果你是在VSCode的Notebook中运行代码,就会看到弹出一个输入框,提示字符就是你写的。
image.png

如果你是在命令行执行脚本,就会收到一行提示字符。
image.png

命令行也可以在VSCode菜单栏中打开终端。
image.png

你会发现,不管输入数字还是字符,返回的都是字符串类型。
因为你可能输入任何数据,不管是字符串还是数字,它都认为你输入了字符串。
但如果想要一个数字怎么办?自己转换。
还记得上一部分末尾讲的数据类型之间的转换么?

  1. x = int(input('请输入一个整数:')) # 转为整数
  2. print(type(x)) # 输出收到内容的类型
  3. # 或者也可以等输入后,再转换
  4. y = input('请输入一个整数:')
  5. z = int(y)
  6. print(type(z))

注意,不管哪种写法,你都在“默认”输入的是整数,如果输入一个浮点数呢?
image.png
是的,会提示出错,无法把0.3转为10进制整数
没有良好的容错设计,一个用户行为偏差,就可能让程序奔溃。

好在,软件工程提供了大量实践去解决这类问题。

TIP:进入Python命令行交互模式,我们就可以把Python当计算器用了。
image.png

4、如何排查错误和找答案

4.1 定位问题

遇到报错,不用紧张,首先试着看懂它在说什么,尤其要找到“关键信息”。
上面的问题,关键信息是什么?注意红色圈出的部分。
image.png

第一个圆圈,是因为用了Notebook的效果,它会指出具体在哪行又问题。
如果是在脚本运行,就不会有第一个圆圈中的箭头,但也会提示你在哪一行出错。
image.png

更关键的信息是在第二个圈。

  1. ValueError: invalid literal for int() with base 10: '0.3'

4.2 搜索相似问题

这时候,你就可以拿着这条信息去网上找了。
但是注意,0.3是你自己的输入,别人可能输入的是其他数据,所以把具体数据去掉后搜索

  1. ValueError: invalid literal for int() with base 10:

我把从GoogleBingBaidu的搜索结果贴出来,大家可以对比参照。

image.png image.png image.png
Google Bing 百度

从前三条结果看,Google和Bing都给出了一个解法:“先转float浮点数,再转int取整”;百度在第五条给出了类似方案。所以搜索引擎首推Google,但考虑到你不一定能访问到,可以选择Bing,再不行就Baidu

于是,我们的代码可以修改下:

  1. x = int(float(input('请输入一个整数:'))) # 先转float,再取其整数
  2. print(x) # 输出0

当我们输入0.3时,程序没有再报错。

4.3 搜索思路

但,事情还没完,也许用户只是手误,本想输入”3”结果输入了”0.3”。
况且,我们都提示了“请输入一个整数:”,用户心里更期待输出“3”,怎么办?

这时候,应该调整搜索思路,不是搜索错误本身,而是应该问搜索引擎:“python怎样判断字符串是不是整数?”
然后,结合搜索引擎的习惯(它更喜欢关键词),把搜索内容调整为关键词组合:“python 判断 字符串 是否整数”。

Bing搜索的结果如下:
image.png
打开第一个网页,我们看到字符串还有些功能,其中:
image.png

我们来尝试下,输入0.3

  1. x = input('请输入一个整数:')
  2. b = x.isdecimal() # 返回布尔值False
  3. print(b) # 输出False

当我们输入1的时候,则输出True
至此,我们已经知道,如何去判断一个输入的字符串,是否是个整数。
于是我们可以设想:当用户输入的不是整数,我们就输出一行提示给他,让他重新输入
这其实就是程序流程控制,虽然还没讲到这,但人的思维其实本身就有。

程序是人思维的一种表达形式。 ——程一初

同时,通过刚才那个网页,我们也知道,还能判断更多类型,比如字符大小写、是否有空格等等。
这其实就是文章开头所谓的“螺旋成长过程”,因为遇到问题,所以会去寻求答案,在寻找中学习,于是懂了更多。

这里我先做个剧透,简单了解即可,后面会具体讲解。

  1. x = input('请输入一个整数:')
  2. if x.isdecimal():
  3. x = int(x)
  4. print(type(x)) # 结果int
  5. else:
  6. print('输入错误,请重新执行程序。')

如果输入0.3,就会输出提示。
image.png

当然,也可以用三元表达式稍加简化:

  1. x = input('请输入一个整数:')
  2. print(type(int(x))) if x.isdecimal() else print('输入错误,请重新执行程序。')

5、常见错误类型

这里只是列出一些入门时容易出现的问题,方便参考,更多的还是需要像上面一样,掌握搜索问题答案的思路。

  1. SyntaxError语法错误:
    1. 字符串引号没有成对,或者你不小心用中文输入了引导
    2. 括号没有成对,尤其是计算比较复杂时,容易少打
    3. print函数调用一定要加括号,网上那些没有加括号的,都是Python2版本
    4. =是赋值操作,用==两个等号判断是否相等
    5. 用了Python关键词当变量名
    6. 如果学了语句控制,如if/else等,稍加冒号也会出语法错误。
  2. IndentationError缩进错误
    1. 多打或少打了空格,建议用4个空格作为缩进,VSCode的Tab也默认是4空格
  3. NameError名字错误
    1. 函数名打错了,比如把print少打了个r或者顺序错了
  4. TypeError类型错误
    1. 数字和字符串不能用+相加,可以用字符串格式化
  5. IndexError索引错误
    1. 这个错误在数据结构中比较多见,表示下标超出范围
    2. 但如果你用下标给字符串切片,也会遇到

总结

今天重点介绍了变量概念,其中包括4大基本数据类型:intfloatstrbool
每种数据类型都有自己的运算方式,它们之间符合条件的也可以互转类型,计算时有优先级顺序。

通过inputprint函数,我们可以在命令行终端里输入输出。

还有几个内置的函数,可以辅助我们观察学习:

  • id(x):找到变量x的内存地址
  • type(x):输出x的数据类型
  • isinstance(x,X):判断x数据类型是否是X类型。

最后,我们以实际遇到问题的形式,讲解了如何在遇到问题时找到关键信息并利用搜索引擎找答案

变量和基本数据类型很重要,它们是程序的基本组成单元。


作者:程一初
更新时间:2020年8月
image.png