第三章 条件分支与循环
3.1 if条件分支
- 单分支判断
**格式:**
if boolean_value1:
子代码模块1
**判断条件:**
boolean_value1为if语句判断条件,以布尔值的形式判断if语句是否执行子代码模块1。
当boolean_value1值为True时,则执行子代码模块1;当值为False时,则不执行。
说明:
第一行的 “ : ” 不能省略,而且必须是半角。
注意缩进格式(TAB键,或四个空格)
- 双分支判断
**格式:**
if boolean_value1:
子代码模块1
else:
子代码模块2
- 多条件多分支判断
**格式:**
if boolean_value1:
子代码模块1
elif boolean_value2:
子代码模块2
else:
子代码模块3
说明:
① if语句里可以嵌套if语句。
② if语句条件里用到了数学运算符、比较运算符、逻辑运算符,而且不同运算符可以组成综合条件判断表达式。
3.2 while循环
**while循环的基本语法格式:**
while boolean_value1:
子代码模块1
boolean_value1为while语句的循环判断条件。
当其值为True时,继续执行子代码模块1;当为False时,终止执行。
while循环可嵌套使用。
定义:线性查找(Linear Search),又称顺序查找,是最简单的查找方法。它的基本思想是从第一个记录开始,逐个比较记录的关键字,直到给定的K值相等,则查找成功;若比较结果与文件中N个记录的关键字不等,则查找失败。
3.3 for循环语句
**格式:**
for <variable> in <sequence>:
子代码模块1
else:
子代码模块2
**说明:**
variable接收sequence集合中获取的成员元素,循环一次接收一次。sequence为集合对象,包括数字序列、字符串、列表、元组、字典等。
说明:
在实际编程中,while、for循环后的再直接跟else子句,用的相对比较少。因为不用else子句,while循环结束后,同样可以执行后续程序代码。
- 利用自定义集合对象实现for循环
>>> fish_record='鲫鱼5条、鲤鱼8条、鲢鱼7条、草鱼2条、黑鱼6条、乌龟1只'
>>> i=0
>>> for var in fish_record:
>>> if var=='条':
>>> i+=1
>>> print(i)
执行结果如下:
> 1
> 2
> 3
> 4
> 5
- 利用内建范围函数range实现for循环
>>> for i in range(9):
>>> if i%2==0:
>>> print('%d是偶数'%(i))
执行结果如下:
> 0是偶数
> 2是偶数
> 4是偶数
> 6是偶数
> 8是偶数
- range函数另一种写法
格式为range(start,stop[,step])
start代表数字的开始值,stop代表数字的结束值,
step代表循环时数字递增的步长(默认值为1,无需设置)。
>>> for i in range(1,5,2):
>>> print(i)
执行结果如下:
> 1
> 3
3.4 循环控制语句
1. break语句
当while或for循环过程所产生的操作已经满足业务要求时,可以通过break语句立刻终止并跳出循环语句。
避免过度循环次数的发生,以提高处理效率。
2. continue语句
continue语句使循环回到开始处,继续循环,而忽略 continue语句后的代码行。
3.5 复杂条件处理
- 成员运算符
运算符 | 运算符规则描述 |
---|---|
in | 如果在指定的序列中有找到值,则返回True,否则返回False |
not in | 如果在指定的序列中没有找到值,则返回True,否则返回False |
具有集合概念的对象有:数字序列、字符串、列表、元组、字典。
注意:成员运算符in和for … in语句里的in的区别?
① 两者不是同一种符号,后者是for循环的固定语法组成成员;前者是独立集合判断运算符号;
② for中in返回的是集合中的一个个元素;成员运算符返回的是逻辑值结果(True和False)。
- 身份运算符
通过身份运算符可以判断两个标识符(对象名)是否引用自一个对象。若在内存中,不同对象名指向的内存地址为同一个地址,那么它们是引用自一个对象。
运算符 | 运算规则描述 |
---|---|
is | is是判断两个标识符是否引用自同一个对象。如果是,则返回True,否则返回False |
not is | not is是判断两个标识符是不是引用自不同一个对象。如果是不同对象,则返回True,否则返回False |
**示例:**
>>> t1=['abc','hello']
>>> t2=[]
>>> t2.copy()
>>> print(id(t1))
>>> print(id(t2))
>>> print(t1 is t2)
**运行结果:**
> 2833095847040
> 2833085562560
> False
- 运算符优先级
优先级顺序 | 运算符 | 运算符名称 |
---|---|---|
1 | ** | 指数 |
2 | ~、+、- | 按位翻转,数前的正号、负号 |
3 | *、/、%、// | 乘、除、取模、取整 |
4 | +、- | 加法、减法 |
5 | >>、<< | 右移、左移运算符 |
6 | & | 位与(AND)运算符 |
7 | ^ | | 位异或(XOR)位或(OR)运算符 |
8 | ==、!=、<、>、>=、<= | 比较运算符 |
9 | =、!=、<、>、>=、<= | 赋值运算符 |
10 | is、is not | 身份运算符 |
11 | in、not in | 成员运算符 |
12 | not、or、and | 逻辑运算符 |
第4章 列表和元组
4.1 接触列表
- 列表的基本知识
定义1:列表(List),是可变的序列,也是一种可以存储各种数据类型的集合,用中括号([ ]),表示列表的开始和结束,元素之间用逗号( , )分隔。列表中每个元素提供一个对应的下标。
(1)列表的基本格式表示
>>> []
>>> test1=[]
>>> print(len(test1))
> 0
>>> test2=[1]
>>> print(len(test2))
> 1
>>> test3=[1,2]
>>> print(len(test3))
> 2
(2)列表的不同数据类型元素成员
>>> testn=[1,2,3,4]
>>> len(testn)
> 4
>>> tests=['Tom','John','Jim']
>>> len(tests)
> 3
>>> testx=['鲫鱼',5,8.5,'鲤鱼',8,6,'鲢鱼',7,10.5]
>>> len(testx)
> 9
>>> testx1=[1,2,3,tests]
>>> len(testx1)
> 4
>>> print(testx1)
> [1,2,3,['Tom','John','Jim']]
(3)列表的下标
列表的下标是从0开始,比如:
>>> 列表元素:testx1=[ 1 , 2 , 3 , ['Tom','John','Jim']]
>>> 下标: [0] [1] [2] [3]
(4)列表的基本操作
列表支持对集合元素进行增加、查找、修改、删除、合并操作等。。
这里使用列表的方法,只需要记住用点号(.)把列表名和方法进行连接即可。
方法名称 | 方法功能描述 |
---|---|
append | 在列表尾部增加元素 |
clear | 列表清空 |
copy | 复制生成另一个列表 |
count | 统计指定元素个数 |
extend | 两个列表元素合并 |
index | 返回指定元素的下标 |
insert | 在指定位置插入新元素 |
pop | 删除并返回指定下标对应的元素 |
remove | 删除列表中指定元素 |
reverse | 反转列表元素顺序 |
sort | 对列表元素进行排序 |
若想知道某一列表的用处,则可以用以下方法获得帮助。
>>> help(list1.append) # 按Enter键,显示英文帮助
- 列表元素增加
(1)append( ),在列表尾部新增元素。
(2)insert( ),可以在任何指定位置增加元素。
**append()方法:**
>>> fruits=['apple',5,'peach',2,'watermelon',15.5]
>>> fruits.append('pear')
>>> fruits.append(3.2)
>>> print(fruits)
> ['apple',5,'peach',2,'watermelon',15.5,'pear',3.2]
**insert( 下标 , 新增元素值 )方法:** 指定下标新增元素值。
>>> fruits.insert(0,'startfruit') # 在fruits列表第一个位置插入新元素
>>> fruits.insert(1,6.8) # 在fruits列表第二个位置插入新元素
>>> print(fruits)
> ['startfruit',6.8,'apple',5,'peach',2,'watermelon',15.5,'pear',3.2]
- 列表元素查找
(1)index()方法查找元素
index()使用格式为L.index(value[,start[,stop]])
。
L代表列表对象;
value表示需要在列表中查找的元素;
start表示在列表里开始查找的下标数;(带中括号的为可选参数)
stop表示代表查找结束的下标数;(带中括号的为可选参数)
若查到元素,则返回第一个找到的元素;若没有找到,则返回 “ ValueError … ” 出错信息。
>>> list1=['Tom',1,2.3,1]
>>> print(list1.index('Tom')) # 在列表里查找'Tom'
> 0 # Tom在列表list1里的下标是0
>>> print(list1.index(1)) # 在列表里查找1
> 1 # Tom在列表list1里的下标是1
>>> print(list1.index(1,2)) # 从下标2开始,在列表里查找1
> 3 # Tom在列表list1里的下标是0
>>> print(list1.index('a')) # 在列表里查找'a'
> Traceback (most recent call last):
> File "<pyshell#11>",line 1, in <module>
> list1.index('a')
> ValueError:'a' is not in list
(2)in成员运算判断
>>> list1=['Tom',1,2.3,1]
>>> print('a' in list1)
> False
(3)用下标读取对应元素
>>> list1=['Tom',1,2.3,1]
>>> print(list1[2])
> 2.3
(4)切片读取
>>> list1=['Tom',1,2.3,1]
>>> print(list1[1:])
> [1,2.3,1]
- 列表元素修改
列表通过指定下标,对对应的元素进行赋值修改
>>> list1=['Tom',1,2.3,1]
>>> list1[3]=2
>>> print(list1)
> ['Tom',1,2.3,2]
与字符串相比,列表元素具有可修改特点,使其具有了更大的操作灵活性。
>>> list1=['Tom',1,2.3,2]
>>> list1[3]='元'
>>> print(list1)
> ['Tom',1,2.3,'元']
- 列表元素删除
(1)clear()方法
>>> listColor=['red',1,'green',2,'yellow',3]
>>> print(len(listColor))
> 6
>>> listColor.clear()
>>> print(listColor)
> []
>>> print(len(listColor))
> 0
(2)pop()方法
pop()方法使用格式L.pop([index])
。其中,L代表列表对象,index为可选参数,当指定该参数时,在指定参数下标处 弹出对应元素并删除该元素;当不指定该参数时,pop()方法默认从列表尾部弹出并删除一个元素。
>>> listpop=['球1','球2','球3']
>>> get_one=listpop.pop() # pop()默认列表尾部操作
>>> print(get_one,' ',listpop) # 打印弹出元素和删除后的列表元素
> 球3 ['球1','球2'] # 弹出“球3”,列表里删除了“球3”
>>> get_one=listpop.pop(0) # 弹出并删除第一个元素
>>> print(get_one,' ',listpop) # 打印弹出元素和删除元素后的列表元素
> 球1 ['球2']
>>> listpop.pop(2) # 在listpop里,试图弹出不存在的元素
> Traceback (most recent call last):
> File "<pyshell#14>", line 1,in <module>
> listpop.pop(2)
> IndexError:pop index out of range
(3)remove()方法
remove()方法使用格式为L.remove(value)
。其中,L代表列表对象,value为需要删除的元素。当需要的列表元素具有多个时,一次只能删除左边第一个。
>>> listpop=['球1','球2','球3','球2']
>>> listpop.remove('球2')
>>> print(listpop)
> ['球1','球3','球2']
若删除元素在列表中不存在,则返回英文报错信息。
(4)del()函数
del()函数可删除列表中指定元素,也可以删除整个列表对象。
>>> listpop=['球1','球2','球3','球2']
>>> del(listpop[2])
>>> print(listpop)
> ['球1','球2','球2']
>>> del(listpop)
>>> print(listpop)
> Traceback (most recent call last):
> File "<pyshell#38>", line 1,in <module>
> Listpop
> NameError:name 'listpop' is not defined
- 列表元素合并
(1)extend()方法:两个列表合并
>>> team1=['张三','李四','王五']
>>> team2=['Tom','Jack','John']
>>> team1.extend(team2) # 把列表team2合并到列表team1中
>>> print(team1)
> ['张三','李四','王五','Tom','Jack','John']
(2)采用 “ + ” 合并
>>> team1=['张三','李四','王五']
>>> team2=['Tom','Jack','John']
>>> id(team1)
> 59187648
>>> team1=team1+team2
>>> id(team1)
> 59074840
>>> print(team1)
> ['张三','李四','王五','Tom','Jack','John']
说明:
① 采用 “ + ” 合并,并直接赋值给team1的方法,会导致team1在内存中的地址号的改变,这说明team1合并后被重新定义了,不是合并前的列表对象了。
② 采用extend()方法,不会导致team1对象内存地址号的变化。
但是这两种方法都导致了team1元素个数的变化。
- 列表元素排序
定义2:排序(Sort),按照次序分增序和减序(又叫升序、降序);增序一般根据ASCII码由小到大对字符、数学等进行排序;降序一般根据ASCII码由大到小对字符、数学等进行排序。
sort()方法使用格式为L.sort(key=None, reverse=False)。其中L为列表对象;key为可选参数,用于指定在作比较之前,调用何种函数对列表元素进行处理,如key=str.lower(lower为大写字母转为小写字母的函数),代表把所有的大写字母转换成小写;reverse为可选参数,默认情况下,sort()方法为增序排序,若reverse=True,则为减序。
>>> fruit=['banana','pear','apple','peach']
>>> fruit_l=fruit.copy()
>>> fruit_l.sort()
>>> print(fruit_l)
> ['apple','banana','peach','pear']
>>> fruit_h=fruit.copy()
>>> fruit_h.sort(reverse=True)
>>> print(fruit_h)
> ['pear','peach','banana','apple']
通过key参数影响sort()排序规则
>>> listA=['Tom','tim','john','Jack']
>>> listA1=listA.copy()
>>> listA1.sort()
>>> print(listA1)
> ['Jack','Tom','john','tim']
>>> listB=listA.copy()
>>> listB.sort(key=str.lower)
>>> print(listB)
> ['Jack','john','tim','Tom']
- 列表其他操作方法
(1)copy()方法
copy()方法使用格式为L.copy()。其中,L代表列表对象,通过copy()方法实现L列表对象在内存中的复制,形成新的对象。
>>> vegetable=['白菜','萝卜','青菜','芹菜','花菜','白菜']
>>> id(vegetable)
> 42718272
>>> new_vege=vegetable.copy()
>>> id(new_vege)
> 42718112
>>> same_list=vegetable
>>> id(same_list)
> 42718272
说明:
copy()复制了数据和引用。
= 普通赋值,增加了引用。
(2)count()方法
>>> vegetable=['白菜','萝卜','青菜','芹菜','花菜','白菜']
>>> vegetable.count('白菜') # 统计白菜数量
> 2
(3)reverse()方法
列表反向操作前后,列表的地址不变,通过id()确认。
>>> l_to_m=[9,8,7,6,5,4,3,2,1]
>>> print(l_to_m)
> [9,8,7,6,5,4,3,2,1]
>>> l_to_m.reverse()
>>> print(l_to_m)
> [1,2,3,4,5,6,7,8,9]
>>> fruit=['banana','pear','apple','peach']
>>> fruit.reverse()
>>> print(l_to_m)
> ['peach','apple','pear','banana']
(4)列表解析
基于列表本身的元素操作语句的解析。
>>> [expression for iter_val in iterable]
>>> [expression for iter_val in iterable if cond_expr]
说明: expression为基于元素的运算表达式;iter_val为从列表iterable迭代的获取的元素i ;if子句判断元素,cond_expr为判断元素的表达式。
示例: 对集合0 … 10中,除0外,其他元素做平方运算
>>> Nums=[i**2 for i in range(11) if i>0]
>>> print(Nums)
> [1,4,9,16,25,36,49,64,81,100]
4.3 元组
元组(Tuple) 类似于列表,与列表的主要区别有以下两点。
(1)元组不能对其元素进行变动,而列表允许。
(2)元素用小括号表示【 ( ) 】,元组用中括号表示【 [ ] 】。
定义5:元组(tuple),是不可变序列,也是一种可以存储各种数据类型的集合,用小括号【 ( ) 】表示元组的开始和结束,元素之间用( , )分隔。
这里的不可变包括不能对元组对象进行增加元素、变换元素位置、修改元素、删除元素操作。
- 元组的基本定义及使用
元组基本定义及使用:
>>> ()
>>> test1=()
>>> print(len(test1))
> 0
多数据类型、多元素、重复元素元组对象定义:
>>> test2=(1,2,2,'1','a')
一个元素元组的定义及使用
>>> test3=(1)
>>> print(type(test3))
> <type 'int'>
>>> test3=('OK',)
> <type 'tuple'>
省略小括号的元组定义及使用
>>> name,age='tom',19
>>> print(name,age)
> ('tom',19)
>>> test4=('jack',10)
>>> name1,age1=test4
>>> print(name1)
> jack
>>> print(age1)
> 10
- 元组的基本操作
元组操作基本方法:
方法名称 | 方法功能及描述 |
---|---|
count | 指定元素个数 |
index | 返回元素下标 |
元组操作相关内置函数:
函数名称 | 函数功能描述 |
---|---|
len | 统计元组元素个数 |
max | 返回元组中最大值的元素 |
min | 返回元组中最小值的元素 |
tuple | 将列表转换为元组 |
type | 返回对象类型 |
del | 删除整个元组对象 |
sum | 对元组对象的所有元素求和 |
(1)建立元组c
>>> select_nums=(1,2,3,4,5)
>>> select_Names=('中国','美国','英国','法国','俄罗斯')
>>> select_mix=('中国',1,'美国',2,'英国',3,'法国',4,'俄罗斯',5)
>>> select_nested=('排名',select_nums)
>>> print(select_nested)
> ('排名',(1,2,3,4,5))
>>> list1=['OK']
>>> select_nested1=('排名',select_nums,list1)
>>> print(select_nested1)
> ('排名',(1,2,3,4,5),['OK'])
>>> id(select_Names)
> 42460528
>>> select_Names=select_Names+('日本',)
>>> id(select_Names)
> 43001872
>>>print(select_Names)
> ('中国','美国','英国','法国','俄罗斯','日本')
元组不支持对元素进行修改和增加,若需要增加元素,则可以采用重新定义元组对象的方法来实现。
(2)查找元素
查找元组中的元素,主要通过元组下标来实现
>>> select_Names[0]
> '中国'
>>> select_Names[:3]
> ('中国','美国','英国')
循环查找
>>> for get_name in select_Names:
>>> if get_names=='法国':
>>> print('法国的下标是%d'%select_Names.index('法国'))
>>> break
> 法国的下标是3
(3)删除元组
通过del()函数,删除整个元组
>>> test1=(3,'TOme',[])
>>> del(test1)
>>> id(test1)
> Traceback (most recent call last):
> File "<pyshell#28>",line 1,in <module>
> id(test1)
> NameError:name 'test1' is not defined
(4)统计元组
1. 通过count()方法直接统计
>>> nums=(1,5,7,5,0,3,5)
>>> nums.count(5) # 统计值为5的元素
> 3
2. 通过len()函数统计
>>> print(len(nums)) # 统计元组对象的元素个数
> 7
3. 统计元组所有元素的累计和
>>> nums=(1,5,7,5,0,3,5)
>>> sum1=0
>>> for add in nums:
>>> sum1=sum1+add
>>> print('元组和为:%d'%(sum1))
> 元组和为:26
4. 利用sum函数直接对元组求和
>>> nums=(1,5,7,5,0,3,5)
>>> print(sum(nums))
> 26
(5)合并元组
>>> t1=(1,2,3)
>>> t2=(4,5,6)
>>> t3=t1+t2
>>> print(t3)
> (1,2,3,4,5,6)
(6)转换元组
列表转换为元组:
>>> list1=['Tom','John','Tim']
>>> l_to_t=tuple(list1)
>>> print(type(l_to_t))
> <class 'tuple'>
元组转换为列表:
>>> t_to_l=list(l_to_t)
>>> print(type(t_to_l))
> <class 'list'>
>>> print(t_to_l)
> ['Tom','John','Tim']