Python基础语法
变量Variables
变量是 Python 中最常用到的,而且 Python 被归类为动态类型语言也是因为它的变量定义方式。那么,什么是变量呢?首先我们来看一下变量的描述:
Variables:Variables are used to store information to be referenced and manipulated in a computer program. They also provide a way of labeling data with a descriptive name, so our programs can be understood more clearly by the reader and ourselves. It is helpful to think of variables as containers that hold information. Their sole purpose is to label and store data in memory. This data can then be used throughout your program.
这里的 Variables 指的就是变量,通过描述我们可以知道,变量最主要的功能就是。
1. 在内存中存储数据,以便后边程序的调用。
2. 变量名称须可以描述所存储的数据,以便被自己和他人更轻松的阅读和理解我们的程序。
变量的定义规则
Python 中,变量并不是随便定义的,而是需要服从强制性的规则和某些约定俗成的规范。
定义规则:Python 中强制使用者的规则,如果不满足则会报错。
1. 变量名只能是 字母、数字或下划线的任意组合
2. 变量名的第一个字符不能是数字
3. 以下关键字不能声明为变量名
'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del',
'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global',
'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print',
'raise', 'return', 'try', 'while', 'with', 'yield'.
定义规范:约定俗成的规范,虽不是强制性的,但是最好遵守。
1. 变量名最好不要用中文、拼音等。虽然在 Python3 中可以,但是不建议。
2. 变量名不要过长或者词不达意。这主要是为了增加代码的阅读性,所以不建议变量名过长,如果词不达意也会让人对你的代码产生误解。
3. 如果变量名要表示的数据过于复杂,有两种方式去命名:驼峰体和下划线,官方推荐是下划线方式。举例:命名变量 “人的个数”
下划线方式:number_of_people
驼峰体:NumberOfPeople、numberOfPeople(每个单词首字母大写,第一个单词的首字母可以不用大写)
变量的声明和赋值
前面讲了变量的定义规则,但是光定义是不够的,还需要存储有用的信息,那么如何把数据给这个变量名呢?那就是用我们的等号 “ = ” 来完成的。下面我想定义一个变量表示数量:
# -*- coding:utf-8 -*-
count = 0
print(count) # print()方法将括号内的内容输出的终端屏幕上
#输出结果为 0
上述代码就声明了一个变量 count,它存储的值为数值 0,而等号的操作有一个专业的名词,叫做赋值。也就是上面的代码表示将数值 0 赋值给了 count 这个变量。print
语句就是将括号里的东西打印到屏幕上。
关于变量的存储想要理解深刻比较难,就像 c / c++ 语言中的最让人头疼的指针,Python 中也有内存地址的概念,这里就先简单叙述一下,加深对变量的理解。看一下下面的代码:
# -*- coding:utf-8 -*-
count1 = 0 # count1赋值为0
count2 = count1 # 把count1的值赋值给count2
print(count1, count2) # 打印count1和count2
count1 = 1 # count1赋值为1
print(count1, count2) # 再次打印count1和count2
# 结果为?
对于第一个 print,结果应该很简单,就是:0 0。那第二个 print 语句呢?如果你实验了这段代码,就会发现结果是:1 0。为什么会这样呢?因为 Python 变量的值其实是存在电脑的内存中,而每一个存储的值都会具有一个起始内存地址用来使电脑快速找到它。在进行赋值操作时变量名其实类似一个标签贴在这个数据上,新来的标签通过上一个标签也找到了这个数据,但是这个新标签并不是贴在旧标签上,而是直接贴在数据上,也就是说 Python 的变量名不管是通过什么路径找到这个数据,当赋值操作完成后变量名是直指数据的。在 Python 中可以使用内置函数 id()
来查看内存地址。
count1 = 0
count2 = count1
print(id(count1), id(count2))
# 输出结果为1423232487560 1423232487560
count1 = 1
print(id(count1), id(count2))
# 输出结果为1423231833960 1423232487560
通过上面的代码可以看出变量 count1 没改变之前两个变量的内存地址是相同的,改变之后变量 count1 内存地址变了,但是变量 count2 的内存地址却没有发生变化。实际上,Python 在创建变量 count1 时,会给这个变量申请一块内存用来存放数据,而这块内存的起始地址就是这个变量的内存地址。 而 count2 与 count1 一样是直接指向这个内存地址,当变量 count1 被重新赋值时,并不是在修改这个变量,而是重新创建了一个变量, 所以CPU又给 count1 分配了一个新的内存地址。
删除变量
如果想在 Python 中删除一个变量可以使用 del
语句。方法很简单,在 del
后面加上想要删除的变量名就行了。
>>> name = 'jojo'
>>> del name
>>> name
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'name' is not defined
删除完变量之后再调用这个变量的话,Python 解释器就会报错 NameError,表示 name 这个变量没有定义。说明这个变量确实被删除了。
这里需稍微提下 Python 的内存管理机制。Python 在对变量的管理采用引用计数的方式,也就是计算指向同一对象的变量名的个数。 当有一个变量名指向’baby’,计数为1;如果有第二个变量名也指向’baby’,计数为2;如果一个对象没有被任何变量名指向,它的计数就为0,这时Python解释器就会将这个对象回收消除,所谓回收消除就是指删除这块内存里的数据,并且释放掉这块内存。 而 Python 会定期自动检测并清除没有指向的变量名。
常量
常量,顾名思义,就是指不变的量。比如说圆周率π,就是不变的量。或者是在程序运行中一旦定义就不改变的量。在C语言中有专门定义常量的语法,一旦定义好了一个常量,如果改变就会报错。
但是在Python中没有专门用于定义常量的语法(当然你可以通过一些第三方的库去实现类似C里的常量),所以程序员们就约定俗成的用全大写的变量名表示常量,也就是当你看到一个变量名是全部大写的,那么就表明这个是常量,不要改动。
I_AM_CONSTANT = True
注释
注释对于代码的阅读性和理解性相当重要。注释就像是书本中对于难理解的地方加以标注然后在文末给出解释一样,注释同样是标注在重要的或难理解的代码旁边,解释代码的含义、作用、功能和注意事项等等。帮助自己和其他程序员快速理解我们的代码。而被注释的内容并不会被程序执行。注释有两种:当行注释 和 多行注释。
当行注释:#
被注释内容。当行注释只能注释本行中 # 号后面的内容。
多行注释:'''被注释内容'''
或 """被注释内容"""
。注意如果选择单引号那就全部用单引号,选择双引号就全部是双引号。多行注释可以注释被三引号括起的全部内容。
# 这里是单行注释,放在 “#” 后面的所有本行文本都会被认为是注释,不被编译器解释
print("hello world") # "#" 也可以放在一条语句的后面对这条语句解释说明
'''
这里是
多行注释
注释引号内部的所有文本
'''
"""
这里也是
多行注释
注释引号内部的所有文本
"""
简述三种数据类型
为什么会存在数据类型呢?比方说数字可以做相应的运算和比较大小,但是计算机分辨不出你给它的数据是不是数字,除非明确的告诉它这个是数字,那么计算机就可以对这个数字做运算。虽然前面定义变量的时候并没有说需要定义数据类型,那是因为 Python 解释器自动帮你处理好了。那为什么还要讲数据类型呢?那是因为每种数据类型都有自己的表现形式,有自己独特的功能和用法,所以必须要清楚。这里先简单讲述三种数据类型 整形 、 字符串 和 布尔型 。下一篇会详细讲解所有的数据类型。
整形 int
整形说白了也就是整数,在 Python 中用 int
表示,也就是 integer 的缩写。Python2 中整形还要分为整形 int 和长整形 long,因为整形的位数有限,一旦超过限制需要转换为长整形。但是在 Python3 中,整形与长整形进行了无缝结合,也就是现在的整形,长度在理论上来说是不受限制的,但是由于计算机内存的限制,实际上是不能无限大的。
score = 80
print(type(score)) # type函数可以用来获得括号内的数据类型
字符串 str
name1 = "JoJo"
name2 = 'Dio'
print(type(name1), type(name2))
没错,上述变量就是字符串,在 Python 中用 str
表示,也就是 string 的缩写。那它跟整形的区别呢?除了文字和数字的区别外,最显眼的就是包住里面文本的引号吧。没错,想要定义一个字符串就用引号包起来。可以使用单引号,也可以使用双引号,效果是一样的,但是必须成对,不能一边单一边双。那如果字符串的内容里需要用到引号怎么办呢?有两种方法:
a = "I'm Ironman" # 里面单外面双或里面双外面单区分开,这种方式有点讨巧
b = 'I\'m Ironman' # 通过 "\" 来进行转义,就是告诉解释器 "\" 后面的符号是一个普通的字符
还有一种情况,当你要打印一篇文章或者很长一段字符串时,单引号和双引号都失去作用了,因为它们括起的字符串都只能是一行,面对多行的情况怎么办呢?还是使用 '''字符串内容'''
或 """字符串内容"""
三引号。三引号不是用来注释的么?没错,但是三引号主要的作用是用来定义多行字符串的。如果被三引号包起的字符串没有赋值给任何变量,那么在程序中也无法去调用,只会安静的作为一个字符串,无法影响程序的运行。所以也可用来注释。
string = """
这里是多行字符串的第一行
这里是多行字符串的第二行
"""
# 其实这里的多行可以看作是在每行结尾加了一个换行符
string1 = "这里是多行字符串的第一行\n这里是多行字符串的第二行" # 两个字符串是一样的
布尔值 bool
布尔值在 Python 中非常常见,布尔值只有两个 True
和 False
(首字母必须要大写)。在 Python 中布尔值用英文 bool
表示。布尔值其实是比较特殊的整形,尽管布尔值用 True 和 False 来表示真和假,但是 True 相当于整形 1 ,而 False 相当于整形 0 。大家知道,计算机底层是使用二进制,而二进制只有 0 或 1 ,所以计算机再进行判断的时候就是像布尔值这样 0 代表不通过,1 代表通过。当然在实际操作中你会发现,不只是 1 能表示True,很多都可以表示:
print(bool(0) # 输出False
print(bool(1)) # 输出True
print(bool(2)) # 输出True
print(bool('你好')) # 输出True
print(bool('')) # 输出False
print(bool(None)) # 输出False
在 Python 中只要你传入一个非空、非0的值,那就返回 True。而你传入整数0或 None
或者任何的空值时,返回的就是 False 了。(None代表空,但是是可以赋值给变量的)
用户交互 input
input()
语句可以将外界输入的信息引入程序内,完成与用户的交互。那么如何使用 input()
呢?
input(显示给用户的信息), 括号内可以是整形、字符串等多种数据类型的数据。
这样就完成了一次交互。这里有一点需要注意:input 语句返回的数据类型一定为字符串,不管你输入进去的是数字还是其他乱七八糟的东西最后都会变为字符串传入程序里。
name = input("输入你的名字:")
print("你好",name)
print(type(name))
条件判断 if
日常生活中,人们经常会碰到很多难题,要做出很多选择。程序内也是一样,就是通过不停的判断来选择要执行的命令。所以条件判断是程序最基础的语法。在 Python 中想要实现条件判断的操作,就是利用 if
、elif
、else
这三个关键词来实现的。那么先说一下它们的用法:
# 满足条件才执行,不满足就不执行
if 条件1: # 满足if条件或这个条件返回的布尔值为真
if下要执行的代码 # 需要缩进4个空格或一个tab键表明是if下的语句体
elif 条件2: # 不满足以上条件但满足该elif条件
elif下要执行的代码 # 同样需要缩进
elif 条件3: # 不满足以上条件但满该elif条件
elif下要执行的代码
...
else: # 不需要写条件,只要不满足以上所有条件即可
else下要执行的代码
单分支
只有一个 if 和满足其条件的语句体
if 条件:
语句体
双分支
if – else 组合,还可以用 if - elif 的形式组合,组合方式多样
if 条件:
语句体
else:
语句体
多分支
if - elif … - else 组合
if 条件:
语句体
elif 条件:
语句体
# 可以有多个elif
else:
语句体
下面举一个具体的例子来说明:
score = int(input('请输入你的成绩:')) # input 输入的数据类型只为str 通过 int() 后可变为整形
if score > 100:
print('成绩不能大于100')
elif 100 >= score >= 90:
print('你的成绩为A')
elif 90 > score >= 80:
print('你的成绩为B')
elif 80 > score >= 70:
print('你的成绩为C')
elif 70 > score >= 60:
print('你的成绩为D')
elif 60 > score >= 0:
print('你的成绩为E')
else:
print('成绩不能小于0')
上述代码还可以进行简化:
score = int(input('请输入你的成绩:'))
if score > 100:
print('成绩不能大于100')
elif score >= 90:
print('你的成绩为A')
elif score >= 80:
print('你的成绩为B')
elif score >= 70:
print('你的成绩为C')
elif score >= 60:
print('你的成绩为D')
elif score >= 0:
print('你的成绩为E')
else:
print('成绩不能小于0')
循环语句
while 循环
while
循环的语法:
while 条件: # 满足条件或者条件布尔值为True才进入循环
循环体 # 记得缩进哦
# 循环体结束后继续判断条件,直至条件不满足退出循环
现在来打印一串等差数列,公差为2,打印10次后退出
count = 0 # 用来保存次数
number = 1 # 等差数列的第一个元素
while count < 10: # count<10 返回的是布尔值
print(number)
number = number + 2
'''这个赋值操作先执行等号右边,再进行赋值操作,
将number+2赋值给number,当下次循环时,
number已经变成比原来大2的值'''
count = count + 1 # 同理
for 循环
for
循环与 while
循环不同,while
循环靠判断条件来循环,而 for
循环是由范围的控制的,超过范围就跳出循环,而 for
循环经常与 range
语句连用:
for i in range(3): # range规定for循环的范围
print(i)
for i in range(1,3): # 可以规定开头结尾(但不包括结尾)
print(i)
for i in range(0,10,2): # 还可以规定步长step
print(i)
死循环
有好的循环,也有坏的循环,比方说死循环。死循环就是因为条件没有设置好而导致无法退出循环,一直循环。我们还是尽量少写死循环。当然这并不是说死循环没有用处,只是暂时还用不到。
count = 0
while True: # True代表条件一直成立
print(count)
count = count + 1
break、continue
break
和 continue
是用来跳出循环的,但是两者的作用大不相同,看下面两段代码:
count1 = 0
while count1 < 10:
print('count1:',count1)
if count1 == 5: # 一个等号是赋值,两个等号才表示相等
break
count1 = count1 + 1
count2 = 0
while count2 < 10:
print('count2:',count2)
if count2 == 5:
continue
count2 = count2 + 1
通过两段代码的结果,我们可以得出两者的作用。break 的作用非常明显,就是遇到 break 就会跳出循环。而 continue 却是结束本次循环,开始下一次的循环,continue 后面的代码也不会执行了,所以上面的代码才会变为死循环。
pass
pass
就是过的意思,当你还不知道要写什么东西的时候可以写入 pass
来占位,保证代码不出错,程序也会正常运行。
比如 if 判断下如果不写任何东西解释器是不允许的,所以会报错,但是你写入 pass,就可以了。
if True:
# if内部没有任何可执行的代码,程序在命令行中会报错
if True:
pass # 如果用pass占位就不会报错
当你不知道写什么的时候就可以先放个 pass
并注释一下,等有了思路回过头来再写。