Python基础语法

本篇内容涉及

  1. 变量
  2. print 语句、del 语句、id 语句
  3. 注释
  4. 简述三种数据类型 int、str、bool  
  5. 用户交互input
  6. 条件语句 if
  7. 循环语句 while and for
  8. break、continue、pass

 

变量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. 如果变量名要表示的数据过于复杂,有两种方式去命名:驼峰体和下划线,官方推荐是下划线方式。举例:命名女朋友的个数

驼峰体(每个单词首字母大写) 下划线
NumberOfGF number_of_gf

 

变量的声明和赋值

前面讲了变量的定义规则,但是光定义是不够的,还需要存储有用的信息,那么如何把数据给这个变量名呢?那就是用我们的等号“ = ”来完成的。下面我想定义一个变量表示名字:

# -*- coding:utf-8 -*-

name = '宝贝'
print(name)

#结果为 "宝贝"

上述代码就声名了一个变量name,它存储的值为“宝贝”,而等号的操作有一个专业的名词,叫做赋值。也就是上面的代码表示将“宝贝”这个字符串赋值给了name这个变量。print语句就是将括号里的东西打印到屏幕上。

明白上面的操作后,请看下面的代码

# -*- coding:utf-8 -*-

name = '宝贝'
name2 = name
print(name,name2)
name = '心肝'
print(name,name2)
# 结果为?

对于第一个print语句,我想答案很简单,就是: 宝贝 宝贝 ,那第二个print语句呢?答案是: 心肝 宝贝 。为什么会这样的呢?这里简单解释下,Python变量在进行赋值操作时变量名其实类似一个标签贴在它存储的数据上,当新来的标签通过上一个标签也找到了这个数据,但是这个新标签并不是贴在旧标签上,而是直接贴在数据上,也就是说Python的变量名不管是通过什么路径找到这个数据,但是当赋值操作完成后变量名是直指数据的。

无标题无标题

>>> name = '宝贝'
>>> name2 = name
>>> print(id(name),id(name2))
1423232487560 1423232487560
>>> name = '心肝'
>>> print(id(name),id(name2))
1423231833960 1423232487560

id()语句是用来查看内存地址的,通过上面的代码可以看出变量name没改变之前两个变量的内存地址是相同的,改变之后变量name内存地址变了,但是变量name2的内存地址却没有发生变化。实际上,Python在创建变量name时,会给这个变量申请一个内存地址用来存放数据,而name2也同样指向这个内存地址,当变量name被重新赋值时,并不是在修改这个变量,而是重新创建了一个变量,所以又给name分配了一个新的内存地址。

 

删除变量

如果想在Python中删除一个变量可以使用 del 语句。方法很简单,在 del 后面加上想要删除的变量就行了。

>>> name = 'baby'
>>> 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中没有专门用于定义常量的语法,所以程序员们就约定俗成的用全大写的变量名表示常量,也就是当你看到一个变量名是全部大写的,那么就表明这个是常量,不要改动。

MY_SALARY = 250

 

注释


注释对于代码的阅读性和理解性相当重要。注释就像是书本中对于难理解的地方加以标注然后在文末给出解释一样,注释同样是标注在重要的或难理解的代码旁边,解释代码的含义、作用、功能和注意事项等等。帮助自己和其他程序员快速理解我们的代码。而被注释的内容并不会被程序执行。注释有两种:当行注释 和 多行注释。

当行注释:# 被注释内容。当行注释只能注释本行中 # 号后面的内容。

多行注释:'''被注释内容''' 或 """被注释内容"""。注意如果选择单引号那就全部用单引号,选择双引号就全部是双引号。多行注释可以注释被三引号括起的全部内容。


 

简述三种数据类型int、str、bool


为什么会存在数据类型呢?比方说数字可以做相应的运算和比较大小,但是计算机分辨不出你给它的数据是不是数字,除非明确的告诉它这个是数字,那么计算机就可以对这个数字做运算。虽然前面定义变量的时候并没有说需要定义数据类型,那是因为Python解释器自动帮你处理好了。那为什么还要讲数据类型呢?那是因为每种数据类型都有自己的表现形式,有自己独特的功能和用法,所以必须要清楚。这里先简单讲述三种数据类型 整形 、 字符串 和 布尔型 。下一篇会详细讲解所有的数据类型。

 

整形int

整形说白了也就是整数,在Python中用 int 表示,也就是integer的缩写。Python2中整形还要分为整形int和长整形long,因为整形的位数有限,一旦超过限制需要转换为长整形。但是在Python3中,整形与长整形进行了无缝结合,也就是现在的整形,长度在理论上来说是不受限制的,但是由于计算机内存的限制,实际上是不能无限大的。

>>> number_of_gf = 0
>>> type(number_of_gf) # type可以用来显示数据类型
<class 'int'>
>>> print('我女朋友的个数:',number_of_gf)
我女朋友的个数: 0

上面的变量 number_of_gf 就属于整形。当然整形还可以用来计算和比较:

>>> 1 + 1
2
>>> 1 > 2
False

 

字符串str

还记得讲变量的时候创建的变量name么?我们来打印一下它的类型。

>>> name = '宝贝'
>>> type(name)
<class 'str'>

没错,这个变量就是字符串,在Python中用 str 表示,也就是string的缩写。那它跟整形的区别呢?除了文字和数字的区别外,最显眼的就是包住里面文本的引号吧。没错,想要定义一个字符串就用引号包起来。但是如果包起数字呢?我们试试看:

>>> 1 + 1
2
>>> '1' + '1'
'11'

这就是字符串和整形的区别啦,用引号包起后,数字也变为了字符串,不在按照整形的规则进行计算,而是按照字符串的规则进行了拼接,上面操作的术语就是叫字符串的拼接。在Python中要定义字符串就用引号包起来,可以使用单引号,也可以使用双引号,效果是一样的,但是必须成对,不能一边单一边双。那如果字符串的内容里需要用到引号怎么办呢?有两种方法:

>>> 'I'm nobody'
  File "<stdin>", line 1
    'I'm nobody'
       ^
SyntaxError: invalid syntax
>>> "I'm nobody" # 里面单外面双或里面双外面单区分开
"I'm nobody"
>>> 'I\'m nobody' # \有转义的作用,就是告诉解释器\后面的符号不是用来定义字符串的
"I'm nobody"

还有一种情况,当你要打印一篇文章或者很长一段字符串时,单引号和双引号都失去作用了,因为它们括起的字符串都只能是一行,面对多行的情况怎么办呢?还是使用 '''字符串内容''' 或 """字符串内容""" 三引号。三引号不是用来注释的么?没错,但是三引号主要的作用是用来定义多行字符串的。如果被三引号包起的字符串没有赋值给任何变量,那么在程序中也无法去调用和引用,只会安静的作为一个字符串,无法影响程序的运行。所以也可用来注释。

string = '''I'm nobody
... I want a girlfriend
... I want money also'''
>>> type(string)
<class 'str'>

 

布尔值bool

布尔值在Python中非常常见,刚刚比较两个整形的大小时返回的 False 就是布尔值的一种。没错,布尔值只有两个 True 和 False (首字母必须要大写)。在Python中布尔值用英文bool表示。布尔值其实是比较特殊的整形,尽管布尔值用True 和 False 来表示真和假,但是 True 相当于整形 1 ,而 False 相当于整形 0 。大家知道,计算机底层是使用二进制,而二进制只有0或1,所以计算机再进行判断的时候就是像布尔值这样0代表不通过,1代表通过。当然在实际操作中你会发现,不只是1能表示True,很多都可以表示:

>>> bool(0)
False
>>> bool(1)
True
>>> bool(2)
True
>>> bool('你好')
True
>>> bool(None)
False

在Python中只要你传入一个非空、非0的值,那就返回 True。而你传入整数0或None或者任何的空值时,返回的就是 False 了。(None代表空,但是是可以赋值给变量的)


 

用户交互input


input语句可以将外界输入的信息引入程序内,完成与用户的交互。那么如何使用input呢?

input(显示给用户的信息) ,这样就好啦,如果括号内的信息是字符串一定要加引号。

name = input("输入你的名字:")

print("你好",name)

这样就完成了一次交互。这里有一点需要注意:input语句收到的数据类型一定为字符串,不管你输入进去的是数字还是其他乱七八糟的东西最后都会变为字符串传入程序里。

a = input("随便输入:")

type(a)

 

条件判断 if


日常生活中,人们经常会碰到很多难题,要做出很多选择。程序内也是一样,就是通过不停的判断来选择要执行的命令。所以条件判断是程序最基础的语法。在Python中想要实现条件判断的操作,就是利用if、elif、else 这三个关键词来实现的。那么先说一下它们的用法:

if 条件:  # 满足if条件或这个条件返回的布尔值为真
    if下要执行的代码 # 需要缩进4个空格或一个tab键表明是if下的语句体
elif 条件:  # 不满足if条件但满足该elif条件
    elif下要执行的代码  # 同样需要缩进
elif 条件:  # 不满足上一个elif条件但是满该elif条件
    elif下要执行的代码
else:   # 不需要写条件,只要不满足以上所有条件即可
    else下要执行的代码
# 满足条件才执行,不满足就不执行

 

 

条件分支

单分支:只有一个 if 和满足其条件的语句体

if 条件:
    语句体

双分支:if – else 组合

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')

乍一看第二段代码貌似不对啊,每个分支的条件都不如第一段代码精确,而且各分支条件还有重复。的确如此,第一段代码每个分支的条件都是非常精确的,但是这会浪费我们很多的时间去编写。那么为什么第二段代码条件不精确却可以得到同样的效果呢?注意了,计算机在执行代码是都是从上至下逐行运行,而解释器也是逐行进行编译的,这就导致它不会无故的跳过某行代码,并且不管你的程序里有多少分支,只会选择一条路去走,所以只要你的各分支顺序正确,就算条件有重叠,仍能在简化代码的同时保证正确运行。这里还要再提一句,如果分支里有 else 一定要放在最后才行。


 

循环语句


条件判断语句只能在程序里执行一次,执行完就过去了,但是有时又需要我们反复多次,这就需要用到循环语句。循环语句有两种:while 和 for,这两种循环各有各的优点,适应不同的需求。

 

while循环

先来看一下while循环的语法:

while 条件:  # 满足条件或者条件布尔值为True才进入循环
    循环体  # 记得缩进哦
# 循环结束后继续判断条件

现在写一个小游戏吧,猜大小,但是只能猜三次,三次都猜不中的话就退出程序了:上述循环在运行之后还是可以发现问题,如果三次都输错可以正常退出。

number = 25  # 设定好的数
count = 0  #  用来计数
while count < 3:
    guess_nunmber = int(input('输一个数看看:'))
    if guess_nunmber == number:  # 一个等号是赋值,两个等号就是相等
        print('猜对啦,厉害')
    elif guess_nunmber > number:
        print('猜的大了,再试试')
    else:
        print('猜的小了,再试试')
    count = count + 1  # 次数加1

上述代码运行起来没有问题,三次输错就会结束程序,但是实验下来就会发现如果没到三次已经猜对了,程序还是会继续,只有三次完事才结束。这是因为循环体里没有直接结束循环的语句,这里可以加上break,break的作用就是跳出循环。

number = 25
count = 0
while count < 3:
    guess_nunmber = int(input('输一个数看看:'))
    if guess_nunmber == number:
        print('猜对啦,厉害')
        break  # 跳出循环
    elif guess_nunmber > number:
        print('猜的大了,再试试')
    else:
        print('猜的小了,再试试')
    count = count + 1

 

for 循环

for 循环与 while循环不同,while循环靠判断条件来循环,而for循环是由范围的控制的,超过范围就跳出循环,而for循环经常与range语句连用:

for i in range(3):  # range规定for循环的范围
    print(i)

for i in range(0,3):  # 可以规定开头结尾
    print(i)

for i in range(0,10,2):  # 还可以规定步长step
    print(i)
number = 25
for i in range(3):
    guess_nunmber = int(input('输一个数看看:'))
    if guess_nunmber == number:
        print('猜对啦,厉害')
        break
    elif guess_nunmber > number:
        print('猜的大了,再试试')
    else:
        print('猜的小了,再试试')

 

死循环

有好的循环,也有坏的循环,比方说死循环。死循环就是因为条件没有设置好而导致无法退出循环,一直循环。当然还是尽量少写死循环。

count = 0
while True:  # True代表条件一直成立
    print(count)
    count = count + 1

 

break、continue、pass


break 和 continue

break和continue都有跳出循环的意思,但是两者的作用大不相同,看下面两段代码:

count = 0
while count < 10:
    print('count:',count)
    if count == 5:
        break
    count = count + 1
count = 0
while count < 10:
    print('count:',count)
    if count == 5:
        continue
    count = count + 1

两段代码的结果显而易见,第一段 count 到 5 就结束循环了,而第二段 count 也是到 5,结果变成了死循环。这里要分辨一下,break 的作用非常明显,就是遇到 break 就会跳出循环。而 continue 却是结束本次循环,开始新的循环,continue 后面的代码也不会执行了,所以上面的代码才会变为死循环。

 

pass

pass就是过的意思,当你还不知道要写什么东西的时候可以写入pass来占位,保证代码不出错,程序也会正常运行。

>>> if True:
...
... print('hello')
  File "<stdin>", line 3
    print('hello')
        ^
IndentationError: expected an indented block

if 判断下如果不写任何东西解释器是不允许的,所以会报错,但是你写入pass,就可以了。

>>> if True:
...     pass
...

 

posted @ 2019-01-21 20:56  路过这个世界  阅读(285)  评论(0)    收藏  举报