Python编程基础
交互式环境
又称REPL模式,是一种简单的交互式的编程环境。在该环境下,执行每一条指令可立即显示结果,方便我们认识了解基本的python指令。
表达式
打开Mind+,切换到Python模式,选择“代码”模式,在文件目录中新建main.py文件。
在终端窗口中,输入“1+1”,按下回车按键,在该模式下执行指令“1+1”,得出结果输出“2”。
此处的指令“1+1”,我们又称之为“表达式”,是编程语言中最基础的编程结构。
表达式包含“值”和操作符,“1+1”表达式中的值为“1”,“+”就是操作符,需要注意一点,表达式总是可以求值,单个值也可以作为表达式。
仅有操作符,不可称为表达式,表达式不完整,同样也会出错。
常见的数学操作符:
算法 | 操作符 | 示例 | 求值 |
---|---|---|---|
加 | + | 1+1 | 2 |
减 | - | 2-1 | 1 |
乘 | * | 2*2 | 4 |
除 | / | 10/3 | 3.33 |
整除 | // | 10//3 | 3 |
取余 | % | 10%3 | 1 |
指数 | ** | 2**4 | 16 |
与数学一样,表达式中的操作符也有优先级,并且优先级与数学计算类似,先执行优先级较高的运算,再从左向右依次计算,同样的,也可以用括号改变计算优先级。
数据类型
上面的示例,我们知道表达式是由值与操作符构成,并且可以求值成单个值。我们所说的值,指的是一类值,通常每个值都对应一个类型,称为数据类型。
在编程语言中,除了数字之外还有文本,这里我们称为“字符串”,字符串通常用单引号''扩起来表示,如'hello'。字符串也可以进行相应的操作处理,后文会提及。
常见的数据类型:
数据类型 | 示例 |
---|---|
整型 | 1,0,-1 |
浮点型 | -0.1,0.25,1.25 |
字符串 | 'h','hh','hhh' |
变量赋值
“变量”,可以想象成一个盒子,盒子中的物品就是存放的数据值。我们可以用盒子的名称表示里面存放的值,而盒子中的物品我们可以更换,因此盒子代表的数值也就随更换而更改。而这个盒子在创建的时候,里面必须要有物品。
不同于其他语言,Python中变量不需要类型声明,创建变量时,必须要对该变量赋值,也就是上述所说的盒子中必须有物品,这样才能创建变量。
“a=1”,通常使用“=”给变量赋值,“=”号的左边“a”称为变量名,“=”号右边称为变量中的值。
变量赋值以后,我们就可以直接使用变量,来表示对应变量中存储的值。
变量名
每个变量都对应一个变量名,但是在python中,有一些命名规范,我们在给变量命名的时候需要遵循以下标准:
只能是一个词
只能包含字母、数字和下划线
不能以数字开头
以下的变量命名均为错误用法:"2a","a-a","a a"....
打印与键盘输入
我们在编程时经常需要将一些信息呈现出来,这里我们使用print()函数,注意后面的括号,通常在名称后面加上括号,代表这是一个函数名称。
print()函数,是Python中最常见的一个函数,用于打印输出。
同样的,我们也交互环境中,通常也会用到一些输入型函数。比如input()。
input(),记录键盘输入文本。该函数返回的值为字符串,在调用该函数时,会等待用户在键盘上输入文本,并按下回车键结束。
示例中,我将键盘输入的文本信息赋值给"Nam"变量,调用input()函数后,等待键盘输入完成(按下回车键),值“xiaoming”就赋值给了"Nam"。
我们再来看一下,配合print()函数使用,将键盘输入的信息直接打印出来。
控制
yes or no 比较操作
程序的执行是有顺序的,自上向下,同时也会像流程图那样,存在分支,通过判断,选择执行对应的代码。
布尔值
前面已经提到数据的类型有整型、浮点型和字符串,这里介绍一个特殊类型的值:布尔值(Boolean),这种类型只有两种值:True和False,代表真或假,两种相反的状态。
布尔值也可以使用在表达式中:True表示1,False表示0。
比较操作符
字面意义,用于比较的运算符,比较两个值,其结果为真或假,所以比较操作符的求值为布尔值。
操作符 | 含义 |
---|---|
== | 等于 |
!= | 不等于 |
< | 小于 |
> | 大于 |
<= | 小于等于 |
>= | 大于等于 |
这里需要注意的是,比较操作符中的“等于”是两个等号“==”,前面提到的赋值为一个等号“=”。
比较两个值,求值为True或者False。
比较操作符,将两边的值进行比较,但是需要知道,小于、大于、小于等于和大于等于不可将数值与字符串类型数据进行比较。
布尔操作符
两个布尔值进行比较,有专门的操作符,称为:二元布尔操作符,"and"和"or"。
"and"和"or"操作符
"and"比较,当两个布尔值同时为True时,求值结果才为Ture。
"and"真值表
表达式 | 求值 |
---|---|
True and True | True |
True and False | False |
False and True | False |
False and False | False |
"or"比较,比较的两个布尔值,只要有一个为True,那么该比较求值即为True。
"or"真值表
表达式 | 求值 |
---|---|
True or True | True |
True or False | True |
False or True | True |
False or False | False |
"not"操作符
"not"操作符,仅作用于一个布尔值,求值原布尔值的相反值。
"not"真值表
表达式 | 求值 |
---|---|
not True | False |
not False | True |
通过前面我们可以知道,比较操作符的求值结果为布尔值,那么比较操作符的结果也可以和布尔值一起进行比较。
上述示例中,"1<2"这样的表达式,通过比较操作符,求值的结果为布尔值,两个布尔值再通过布尔操作符进行比较。
条件
程序执行前面提到是自上向下,一条一条执行,但是往往会存在许多分支,分支的选择就是根据条件进行判断。这里条件的求值同样为布尔值,当条件满足,则执行当前分支程序,反之,则根据条件判断其他分支。
代码块
python语言,不同于其他语言,像C语言,在同一条件下的代码,使用大括号包含。而python语言中,以代码块的形式约束。
根据代码的缩进,判断代码的开始与结束。
代码块规则:
缩进增加,代码块开始。
代码块可包含其他代码块。
缩进减少为0,或减少为外面包围代码块的缩进,代码块结束。
if语句
if语句:如果条件为真(条件求值为True),程序执行语句后的代码块。
if语句规则:
if关键字
判断条件
冒号
代码块开始,缩进代码块
else语句
通常,if语句后面紧跟着else语句,else代表”否则“,当if语句条件求值为False时,执行else语句。
else语句规则:
else关键字
冒号
代码块开始,缩进代码块
elif语句
if与else语句,条件判断为if语句中条件的求值结果,但是往往,我们在面对复杂程序时,需要多个条件判断。
elif语句规则:
elif关键字
条件
冒号
代码块开始,缩进代码块
if语句后面可以跟多个elif语句,从if代码块的开始,依次判断后面列出的条件求值,当判断其中某一个elif语句条件求值为True时,剩下后面的elif语句将会跳过,不会执行。
示例:判断输入学生姓名或者密码是否正确。
while语句
while语句,又称循环语句,可以语句中的代码块一遍又一遍的执行,只要while语句条件判断求值为真,while语句会永远循环执行下去。
while语句规则:
while关键字
条件
冒号
代码块开始,缩进代码块
从上述示例中,我们可以看出,while语句与与if语句规则类似,但是while语句会重复执行,代码块没执行一次,就会对条件进行一次求值判断,而这个判断,总是在每次循环开始前进行求值。
break语句
前面提到,while语句为循环语句,代码块会循环执行,直到while条件求值为假,那么有没有方法,可以提前跳出while循环?
这里我们使用一个新的语句,break语句,在代码循环过程中,如果遇到break语句,会针对break语句条件进行求值判断,求值为真则跳出while循环。
continue语句
continue语句与break语句效果类似,都处在循环语句内部,但是不同的是,当程序执行遇到continue语句,循环也会立刻跳出,但是会从循环的开始重新开始条件判断执行。
for循环
在前面,已经介绍了一种循环语句:while循环,我们已经了解到,while语句是当条件判断求值为真,则代码块循环执行。
那么,如果我们想要程序循环执行一定次数,而不是重复循环执行,这里就可以用到for循环语句。
for语句规则:
for关键字
变量
in关键字
调用range()方法
冒号
代码块开始,缩进代码块
我们回到while语句示例,将变量num初始赋值为1,循环判断num是否小于10,当条件满足,则打印num,并将num变量赋值为num+1。这个示例我们都知道,在第9次的执行完毕之后,判断”num<10“,该条件已经不满足,所以循环跳出。下面我们用for循环语句试一下。
range()函数,用于创建整数列表,括号中一般有三个参数:起始值、终止值、步长
整数列表范围包括起始值,但不包括终止值
range(0,100,10)表示从0到90,间隔步长为10
内置库导入
前面我们使用的input()、print()等函数属于python的内建函数,python本身含有一组函数模块,称为“标准库”。通常我们在使用一些模块中的函数时,需要先导入该模块,才能使用模块下的函数。
这里我们就要用到import语句。
import语句规则:
import关键字
模块名称1,模块名称2(若同时导入多个模块,模块名称之间用逗号隔开)
eg:import random
from import语句
from import是import语句的另一种格式。
import语句规则:
from关键字
模块名称
import
*
eg:from random import*
那么这两种语句有什么区别呢?
在上面的import语句中,在我们导入了random模块后,在后续代码编写过程中,在使用该模块内函数时,我们需要加上前缀"random."。而使用from import语句导入模块后,可直接使用模块内的函数,无需加任何前缀。
示例
前面我们知道了使用break语句或者continue语句可以跳出循环执行,那么如果我们想要终止程序,就需要导入sys模块,使用sys模块中的exit()函数。
函数
在前面我们使用诸如:print()、input()等内建函数,直接调用使用,那么我们也可以自己编写自己的函数。
我们先来看一个简单的函数:
这里我们用了”def“语句,声明创建名称为”sayHi()“的函数,函数功能为分别用英文、中文、韩语、泰语打印”你好“。
在最后,我们调用一次sayHi()函数,运行后打印出结果。
def语句和参数
先看示例:
对比上一个示例,我们在sayHi()函数的声明定义里,增加了一个“name”参数,这里的参数为一个变量,sayHi()函数被调用时,就会针对该变量执行函数中的程序。
如后文代码,我们调用sayHi()函数,参数设为“xiaoming”,执行程序后,打印输出“Hello xiaoming”。
函数的返回值
我们需要知道,函数的程序执行,会带有执行的求值结果。先来看一下python内置函数len()。
可以看到python内置函数len()返回了对象(此处是字符串abc)的长度,我们称函数执行得出求值的结果,称为该函数的返回值。
下面我们来看一个示例:
这里我们定义了一个函数GetrandomNum(num),根据参数num的改变,函数返回不同的结果,这里使用前面提及的random函数,产生1-6的随机数,调用GetrandomNum(num)函数,观察函数返回值。
当然,函数的返回值也可以直接被另一个函数调用:
前面提到,函数的执行,会得出函数代码执行的求值结果,这个结果称为函数的返回值,那么我们也会用到没有值返回的函数,但是其实这个函数存在求值结果,它的求值结果为没有值,即None。
全局与局部作用域
作用域,可以理解成变量的容器,而全局作用域和局部作用域,可以看成是该变量的有效范围。比如我们在程序初始位置定义一个变量,它的有效作用范围是整个程序,可以被任何函数调用,随着程序执行开始到程序执行终止。而当我们在定义函数时,定义的变量,它的有效作用范围只针对当前函数。
通过作用域的描述,我们可以得出以下几点结论:
- 局部变量不可在全局作用域中使用
- 局部作用域不可使用其他局部作用域内的变量
- 全局变量可以被局部作用域中的函数使用
“局部变量不可在全局作用域中使用”,那么我们可不可以把局部变量的名称和全局变量的名称定义成一样呢?
答案是可以,python中局部变量和全局变量同名是被允许的,但是往往在使用中,为了避免造成理解混乱,建议尽量不要在不同作用域中使用相同的名称。
列表
列表数据类型,与前面提到的数字、字符等数据类型一样,列表本身是一个值,称为“列表值”,可以作为一个值保存在变量中,被函数调用。
列表是由多个值构成的一个序列,其中列表中的单个值,我们称为“表项”,表项在列表中按照次序组成序列,多个表项以左方括号开始,右方括号结束,表项之间使用逗号分隔,例如:“[1,2,3,4]”。
需要注意一点的是,一个列表中的表项可以为多种数据类型组合,例如“[1,a,apple]”,同时,也可以允许空列表的存在,“list=[]”表示list列表不包含任何值,类似于空字符串。
获取列表中的表项
示例中,我们定义列表"a=[1,22,4,5]",将“1,22,4,5”保存在“a”变量中,那么列表a的列表值即为“[1,22,4,5]”。
我们在使用列表时,往往需要使用列表中的单个表项,那么我们如何获取列表中的单个值呢?
我们知道列表是多个值构成的序列,列表中的值按次序排列,每一个表项对应一个唯一“位置”,我们称为“下标”,可以通过“位置”,来获取表项。
列表中下标从0开始,即0“位置”指代列表的第一个表项,最后一个表项的下标为该列表表象数目减一。
下标从0开始向上增加,但是还有一种情况,我们还可以使用负数作为下标值,下标“-1”表示列表中的最后一个表项,“-2”表示倒数第二个表项。
我们知道在列表中,通过下标可以获取列表中的单个表项,那么,我们也可以通过下标同时获取列表中多个表项。
示例中,我们通过“a[0:2]”的方法,“截取”列表a中第一个值到第三个值之间的表项,类似于“切片”,将多个值的序列,切取其中一部分。
不同于从列表中取单个表项,“切片”式方法,需要给出两个整数,对应切片的起始位置下标和结束位置下标,需要注意的是,切片得出的表项不包含结束位置下标的值。
获取列表的长度
在前面,我们介绍函数返回值的时候提到了len()函数,该函数的作用是返回对象(字符、列表、元组等)的长度或项目个数。
在这里,我们可以使用len()函数来获取列表长度,也就是列表中表项的个数。
列表拼接与列表复制
要实现列表的拼接或者复制,方法类似于字符串拼接与字符串复制,需要使用到前面提到的操作符,其中“+”操作符,可以帮助我们实现将两个列表拼接,组成一个新的列表。
同样的,想要实现列表的复制,可以使用“*”操作符。
表项删除
前面我们知道了可以通过下标获取列表中的表项,我们也可以删除对应下标位置的表项。
这里我们使用del语句。
当然,在我们不知道表项下标时,可以直接根据表项进行删除。
这里我们使用remove()语句,调用remove方法,括号中输入想要删除的表项,如下例:
需要注意的是,使用remove()方法删除表项,若被删除的表项值在列表中多次出现,那么该表项只会在列表第一次出现的位置被删除。
表项修改
通过下标可以获取表项和删除表项,当然,我们也可以使用下标来改变对应的表项值。
列表的使用
在列表中添加值
在列表末尾参加新的值,调用append()方法。
这个方法添加的表项为列表末尾固定位置,想要在列表指定位置添加值,需要调用insert()方法。
insert()语法:
- list.insert(index,obj)
- index——对象obj需要插入的索引位置,即下标
- obj——要插入列表中的对象,即新增表项
查找列表中的值
通过使用index()方法,输入想要查找的值,查看该值是否存在于列表中。
index()方法,根据定义,我们知道它是一个带有返回值的函数,若值存在于当前列表中,则返回对应表项的下标,若不在当前列表,则返回报错:ValueError。
当然,我们也可以使用in 和not in 操作符来判断一个值是否存在于列表中。
我们在前面表达式的介绍中知道,操作符用在表达式中,连接两个值,并求布尔结果。
这里,我们使用in 或not in 操作符来检查。
字典
与列表类似,字典也是多个值的组合,但是不同于列表,每个表项根据下标进行索引。而字典,每个值都有对应的键,组合成为“键值对”。格式如下:
d = {key1 : value1, key2 : value2 }
每个键值对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中。
字典特性:
- 字典中的值与相应的键关联,不需要位置下标索引,所以字典是无序列的。
- 键值对中,键一般是唯一的,与值对应,如果字典中出现重复的键,那么最后一个键值会替换前面出现过的键。
- 键值对中,值可以是任意数据类型,但键必须是不可变的。
字典方法
根据定义,字典中的键值对,有三个常用方法,keys()、values()和items(),3个函数都有返回值,分别对应字典中的键、值和键值对。
###访问字典中的值
根据字典键值对的特性,我们可以直接通过键来获取对应值。
检车字典中是否存在某值
想要获取字典中的值,首先我们先要判断该值是否存在于字典中。
方法与列表类似,我们也可以使用in和not in 操作符。需要注意的是,我们可以通过上面提到的keys()、values()和items()三个方法,通过键、值或键值对来检查是否存在。
平常使用过程中,我们想要访问一个键值,还要判断该值是否存在于字典中,相对比较麻烦,这里介绍另一种方法:get()。
get()方法:返回指定键的值。
- 语法:d.get(key,default=None)
- key——字典中需要查找的键
- default——如果指定的键不存在,返回的默认值(默认值None或者指定默认值)
###修改字典数据
通过键可以获取对应值,同样的,我们也可以通过键,来修改值。
当然,我们也可以通过键值对,添加数据。
删除字典数据
在列表的介绍中,我们知道可以使用del语句,根据位置下标删除表项。在字典中,我们也可以使用del语句,不同的是,字典中值的索引是与键关联,所以在字典中使用del语句,需要键索引。
这里,我们还可以使用clear()方法,来清空整个字典。