对于初学者,基础语法是第一关,也是最枯燥的一关,我的学习建议是:先“够用”,再“深造”。
Python每年都会发布一个大版本,增加一些新语法、新特性。但这些新内容,也许你很长一段时间内都不会用到。把时间精力聚焦在最常用的80%,尽快投入实践应用,在实践中盘旋成长,这才是入门的意义。
先看我画的一张图,标出了Python基础学习的知识点,几乎涵盖本课程80%内容。后续课程,也会围绕图中知识点展开讲解,建议收藏作为参考。
本文学习内容如下:
- 变量及命名:关键概念理解
- 赋值和计算:基本表达式
- 输入和输出:基本应用模式
- 如何排查错误和找答案
- 常见错误类型
在开始之前,先明确几个入门必懂的概念:代码、程序文件、解释器、运行时。
- 代码,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()
,它用来判断对象的数据类型。
x = 1
type(x) # 返回<class 'int'>
isinstance(x,int) # 测试x是否是int,返回True
变量起名字也有规范:
- 可以是字母、数字、下划线的组合
- 第一个字符不能是数字
- 字母区分大小写,如
a
和A
是两个不同变量 - 不能用Python保留的关键词
虽然看起来起名字很多选择,但我建议你从开始就养成习惯,可以少出错,更容易理解。
比如最基本的:
- 用有意义的词,如果太长可以截一部分作为缩写,如
score
- 如果有多个意义的词,中间加下划线,如
school_name
- 变量字母尽量全小写,如
total
- 常量字母全部大写,如
MAX_LEN
2、赋值和计算
理解了变量,我们就可以用它”装载“数据,进而计算。
这里虽然用了“装载”一词,但你要记住,变量本质是指向了数据的内存位置,是一个地址。
只不过,我们在日常使用中,很理所当然地把它当成了一个“数据容器”。
我们用赋值操作为变量“装载”数据。
2.1 整数和浮点数
x = 1 # 整数
x = 3.14 # 浮点数
x = 'Hello' # 字符串
x = True # 布尔值
整数和浮点数很容易理解,和我们学过的数学一致。
2.2 字符串
字符串可以用单'x'
、双"x"
、三引号"""x"""
,常见的用法有2个:
- 如果遇到“话中话”,双引号放里面,单引号放外面。
s = 'I know that "A" and "a" are two different variables.'
- 整块的代码注释,可以用三引号
"""
注释是写给人看的
方便了解代码意义
程序运行时会跳过
"""
s = 'abc' # 单行注释也可以用一个#符号
字符串操作主要包括:分割、连接、切片、查找、替换、大小写转换、首位去空格、格式化。
你不必马上记住,可以练习一下,后面用到的时候再过来查找。
s = 'Hello Python, hi yichu.'
# 分割,按逗号分成两部分,返回一个list(下一节会讲数据结构)
ss = s.split(',')
# 连接,用join把两部分连接起来
# 加号操作在字符量大情况下效率低
# 还有其他连接方式,先记住这两个
s1 = ','.join(ss)
s2 = 'abc' + 'def'
s3, s4 = 'abc', 'def' # 多变量赋值
# 切片,[下标],下标从0开始
# [start:end]表示从start开始,到end-1结束
# [::-1]表示把字符串反转
# 结果分别是'H', '.', 'Python', '.uhciy ih ,nohtyP olleH'
s[0], s[-1], s[6:12], s[::-1]
# 查找,返回6,如果找不到返回-1
# 其他的参数和查找函数可以用到再查,先记住2个
s.find('P')
s.index('x') # 找不到会报异常
# 替换,返回一个新字符串s3
s.replace('Python', 'vscode')
# 大小写转换
s.upper() # 转大写
s.swapcase() # 大变小,小变大
# 首位去空格
s.strip()
# 格式化
# 优先使用format
s3 = '%s: %s' % ('python', 2020)
s3 = '{}: {}'.format('python', 2020)
2.3 数字运算
相对简单,基本如”加减乘除”:
# 加,结果3
x = 1 + 2
# 减,结果:1.1
y = 3.1 - 2
# 乘,结果72
z = 8 * 9
# 除,结果0.5
a = 2 / 4
# 整除,结果0
b = 2 // 4
# 取余,结果2
c = 20 % 3
# 乘方,4的3次方,结果64
d = 4 ** 3
# 以上操作还可以联合赋值运算一起
x *= 3 # 等价于:x = x * 3
x /= 3 # 等价于:x = x / 3
# 其他同理
x += 1 # Python中不存在x++这样的写法
2.4 逻辑计算
布尔值是逻辑计算的结果,只有True
和False
两个。
计算过程一般会涉及到比较、判断以及逻辑计算。
# 数值比较
b = 1 > 2 # False
b = 1 >= 0.5 # True
b = 1 <= 0.5 # False
# 逻辑运算
b = 1 > 2 and 1 > 0.5 # False
b = not b # True
b = 1 > 2 or 1 > 0.5 # True
# 字符串比较
b = 'abc' == 'abc' # True
b = 'abc' != "abc" # False
# is 和 in
b = 's' in 'string' # True
b = 's' not in 'string' # False
b = 's' is 's' # True
b = 's' is not 's' # False
c = isinstance(b,bool)) # True
2.5 运算优先级
就像四则运算有先后顺序,Python也有。记不住正常,只要记住一些常见的即可。
实在记不住,可以用小括号加强,因为小括号优先级最高,比如:
x = ((2-1)*(2**2)-3*4)//2 # 结果-4
2.6 数据类型转换
最后,讲一下数据类型之间的转换。
整数、浮点数、字符串、布尔值,之间经常需要互转。
x = 100.1
y = int(x) # 结果100
z = float(y) # 结果100.0
x1 = float('100.2') # 结果100.2
x2 = int('100.3') # 结果出错,转换失败
bool(x) # True
bool(0) # False
目前重点掌握上述4类基础数据运算即可。
Python也有提供位计算,等以后需要用了,再看不迟。
此外,字符串处理几乎是使用最频繁的,在查找匹配方面,还有更专业的正则表达式。
但就像一开始说的,“够用即可”,等到用得上,再学不迟,首先掌握基本常用的那80%,能解决问题就够了。
3、输入和输出
输入输出,不仅是人和计算机交互方式,也是程序间数据交换方式。
比如,我们上网,提交表单就是我们向服务器的输入; 服务器处理后返回的网页就是它的输出。 只不过,中间需要经过多层数据转换,会复杂些。
这里,我们主要讲最基本的命令行终端输入输出。
即,在命令行中,我们输入一些数据,经过我们写的代码计算后,用字符形式在终端显示。
最上面那张图里面已经包含了输入输出的2个内置函数:print()
和input()
。
学会用print()
输出,你就能随时打印变量出来观察:
x = 1 # 整数
print(x) # x值
print(type(x)) # 类型int
print(id(x)) # 内存地址
x = 3.14 # 浮点数,表示有小数,类型float
print(x)
print(type(x))
print(id(x))
x = 'Hello' # 字符串,类型str
print(x)
print(type(x))
print(id(x))
x = True # 布尔值,代表逻辑判断的"真"和"假",类型bool
print(x)
print(type(x))
print(id(x))
s = 'hello'
print(id(s)) # 留意和最下面的对比
s += 'world'
print(s)
print(id(s)) # 留个思考题:为什么地址变了
当然,你也可以用上一节介绍的VSCode中Python数据查看器观察。
接着我们设计一个最简单的输入输出:
x = input('请输入一个整数:') # 等待输入
print(type(x)) # 输出收到内容的类型
如果你是在VSCode的Notebook中运行代码,就会看到弹出一个输入框,提示字符就是你写的。
如果你是在命令行执行脚本,就会收到一行提示字符。
命令行也可以在VSCode菜单栏中打开终端。
你会发现,不管输入数字还是字符,返回的都是字符串类型。
因为你可能输入任何数据,不管是字符串还是数字,它都认为你输入了字符串。
但如果想要一个数字怎么办?自己转换。
还记得上一部分末尾讲的数据类型之间的转换么?
x = int(input('请输入一个整数:')) # 转为整数
print(type(x)) # 输出收到内容的类型
# 或者也可以等输入后,再转换
y = input('请输入一个整数:')
z = int(y)
print(type(z))
注意,不管哪种写法,你都在“默认”输入的是整数,如果输入一个浮点数呢?
是的,会提示出错,无法把0.3转为10进制整数
。
没有良好的容错设计,一个用户行为偏差,就可能让程序奔溃。
好在,软件工程提供了大量实践去解决这类问题。
TIP:进入Python命令行交互模式,我们就可以把Python当计算器用了。
4、如何排查错误和找答案
4.1 定位问题
遇到报错,不用紧张,首先试着看懂它在说什么,尤其要找到“关键信息”。
上面的问题,关键信息是什么?注意红色圈出的部分。
第一个圆圈,是因为用了Notebook的效果,它会指出具体在哪行又问题。
如果是在脚本运行,就不会有第一个圆圈中的箭头,但也会提示你在哪一行出错。
更关键的信息是在第二个圈。
ValueError: invalid literal for int() with base 10: '0.3'
4.2 搜索相似问题
这时候,你就可以拿着这条信息去网上找了。
但是注意,0.3
是你自己的输入,别人可能输入的是其他数据,所以把具体数据去掉后搜索。
ValueError: invalid literal for int() with base 10:
我把从Google
、Bing
和Baidu
的搜索结果贴出来,大家可以对比参照。
Bing | 百度 |
从前三条结果看,Google和Bing都给出了一个解法:“先转float浮点数,再转int取整”;百度在第五条给出了类似方案。所以搜索引擎首推Google
,但考虑到你不一定能访问到,可以选择Bing
,再不行就Baidu
。
于是,我们的代码可以修改下:
x = int(float(input('请输入一个整数:'))) # 先转float,再取其整数
print(x) # 输出0
当我们输入0.3
时,程序没有再报错。
4.3 搜索思路
但,事情还没完,也许用户只是手误,本想输入”3”结果输入了”0.3”。
况且,我们都提示了“请输入一个整数:”,用户心里更期待输出“3”,怎么办?
这时候,应该调整搜索思路,不是搜索错误本身,而是应该问搜索引擎:“python怎样判断字符串是不是整数?”
然后,结合搜索引擎的习惯(它更喜欢关键词),把搜索内容调整为关键词组合:“python 判断 字符串 是否整数”。
用Bing
搜索的结果如下:
打开第一个网页,我们看到字符串还有些功能,其中:
我们来尝试下,输入0.3
:
x = input('请输入一个整数:')
b = x.isdecimal() # 返回布尔值False
print(b) # 输出False
当我们输入1
的时候,则输出True
。
至此,我们已经知道,如何去判断一个输入的字符串,是否是个整数。
于是我们可以设想:当用户输入的不是整数,我们就输出一行提示给他,让他重新输入。
这其实就是程序流程控制,虽然还没讲到这,但人的思维其实本身就有。
程序是人思维的一种表达形式。 ——程一初
同时,通过刚才那个网页,我们也知道,还能判断更多类型,比如字符大小写、是否有空格等等。
这其实就是文章开头所谓的“螺旋成长过程”,因为遇到问题,所以会去寻求答案,在寻找中学习,于是懂了更多。
这里我先做个剧透,简单了解即可,后面会具体讲解。
x = input('请输入一个整数:')
if x.isdecimal():
x = int(x)
print(type(x)) # 结果int
else:
print('输入错误,请重新执行程序。')
如果输入0.3
,就会输出提示。
当然,也可以用三元表达式
稍加简化:
x = input('请输入一个整数:')
print(type(int(x))) if x.isdecimal() else print('输入错误,请重新执行程序。')
5、常见错误类型
这里只是列出一些入门时容易出现的问题,方便参考,更多的还是需要像上面一样,掌握搜索问题答案的思路。
SyntaxError
语法错误:- 字符串引号没有成对,或者你不小心用中文输入了引导
- 括号没有成对,尤其是计算比较复杂时,容易少打
- print函数调用一定要加括号,网上那些没有加括号的,都是Python2版本
=
是赋值操作,用==
两个等号判断是否相等- 用了Python关键词当变量名
- 如果学了语句控制,如
if/else
等,稍加冒号也会出语法错误。
IndentationError
缩进错误- 多打或少打了空格,建议用4个空格作为缩进,VSCode的Tab也默认是4空格
NameError
名字错误- 函数名打错了,比如把
print
少打了个r或者顺序错了
- 函数名打错了,比如把
TypeError
类型错误- 数字和字符串不能用
+
相加,可以用字符串格式化
- 数字和字符串不能用
IndexError
索引错误- 这个错误在数据结构中比较多见,表示下标超出范围
- 但如果你用下标给字符串切片,也会遇到
总结
今天重点介绍了变量概念,其中包括4大基本数据类型:int
、float
、str
、bool
。
每种数据类型都有自己的运算方式,它们之间符合条件的也可以互转类型,计算时有优先级顺序。
通过input
和print
函数,我们可以在命令行终端里输入输出。
还有几个内置的函数,可以辅助我们观察学习:
id(x)
:找到变量x的内存地址type(x)
:输出x的数据类型isinstance(x,X)
:判断x数据类型是否是X类型。
最后,我们以实际遇到问题的形式,讲解了如何在遇到问题时找到关键信息并利用搜索引擎找答案。
变量和基本数据类型很重要,它们是程序的基本组成单元。
作者:程一初
更新时间:2020年8月