控制语句 and 函数
控制语句
for循环结构和可迭代对象遍历
for循环通常用于可迭代对象的遍历
for 变量 in (20,30,40):
print(x*3)
举例:
for i in range(15):
print(i,end='\t')
输出:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
各种遍历:
# 遍历字符串
for x in "GSH":
print(x,end='\t')
print('*****************')
# 遍历列表
for x in list('abcd'):
print(x,end='\t')
print('*****************')
# 遍历字典
zd = {'name':'GSH','age':34,'job':'student'}
for x in zd:
print(x,end='\t') # 遍历字典里所有的key
print('*****************')
for x in zd.keys():
print(x,end='\t') # 同样是遍历字典里的key
print('*****************')
for x in zd.values():
print(x,end='\t') # 遍历字典里的value
print('*****************')
for x in zd.items():
print(x,end='\t')
输出:
G S H *****************
a b c d *****************
name age job *****************
name age job *****************
GSH 34 student *****************
('name', 'GSH') ('age', 34) ('job', 'student')
可迭代对象
Python包含下几种可迭代对象:
- 序列: 字符串 列表 元祖
- 字典
- 迭代器对象(iterator)
- 生成器对象(generator)
range()对象
格式:
range(start, end [,step])
举例:
for i in range(10):
print(i,end='\t')
print()
for i in range(3,10):
print(i,end='\t')
print()
for i in range(3,10,2):
print(i,end='\t')
输出结果:
0 1 2 3 4 5 6 7 8 9
3 4 5 6 7 8 9
3 5 7 9
嵌套循环
一个循环体内可以嵌入另一个循环,称之为’循环嵌套’或者’多重循环’。
for i in range(5): # 先循环输出列
for j in range(5): # 再循环输出行
print(i,end='\t')
print() # 换行
输出结果:
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
打印九九乘法表:
for m in range(1,10): # 打印列
s = ''
for n in range(1,1+m): # 打印行 外循环控制内循环
s += str.format("{0}*{1} = {2}\t",m,n,m*n)
print(s)
输出结果:
1*1 = 1
2*1 = 2 2*2 = 4
3*1 = 3 3*2 = 6 3*3 = 9
4*1 = 4 4*2 = 8 4*3 = 12 4*4 = 16
5*1 = 5 5*2 = 10 5*3 = 15 5*4 = 20 5*5 = 25
6*1 = 6 6*2 = 12 6*3 = 18 6*4 = 24 6*5 = 30 6*6 = 36
7*1 = 7 7*2 = 14 7*3 = 21 7*4 = 28 7*5 = 35 7*6 = 42 7*7 = 49
8*1 = 8 8*2 = 16 8*3 = 24 8*4 = 32 8*5 = 40 8*6 = 48 8*7 = 56 8*8 = 64
9*1 = 9 9*2 = 18 9*3 = 27 9*4 = 36 9*5 = 45 9*6 = 54 9*7 = 63 9*8 = 72 9*9 = 81
break中断
break语句可用于while和for循环,用来结束整个循环。当有嵌套循环时,break语句只能跳出最近的一层循环。
举例说明: 不断的进行输入,直到输入Q为止。
while True:
a = input('请输入一个字符(输入Q或q结束): ')
if a.upper() == 'Q':
print('循环结束 退出')
break
else:
print(a)
打印结果:
请输入一个字符(输入Q或q结束): 23
23
请输入一个字符(输入Q或q结束): 24
24
请输入一个字符(输入Q或q结束): 54
54
请输入一个字符(输入Q或q结束): 12
12
请输入一个字符(输入Q或q结束): q
循环结束 退出
continue继续下一次
continue语句是结束本次循环,继续下次循环,多个循环嵌套时,continue也是应用于最近的一次循环。
综合练习:
empNum = 0
salarySum = 0
salarys = []
while True:
s = input('请输入员工的薪资(按Q或者q结束):')
if s.upper() == 'Q':
print('录入完成')
break
if float(s) < 0:
print('您输入的小于零,不对')
continue
empNum += 1
salarys.append(float(s)) # 将薪资都添加到列表中
salarySum += float(s) # 求薪资总和
print("员工总数:",empNum) # 求员工总数
print("录入薪资:",salarys) # 打印salary列表
print("平均薪资",(salarySum/empNum)) # 平均薪资值
输出结果:
请输入员工的薪资(按Q或者q结束):10
请输入员工的薪资(按Q或者q结束):20
请输入员工的薪资(按Q或者q结束):30
请输入员工的薪资(按Q或者q结束):20
请输入员工的薪资(按Q或者q结束):10
请输入员工的薪资(按Q或者q结束):q
录入完成
员工总数: 5
录入薪资: [10.0, 20.0, 30.0, 20.0, 10.0]
平均薪资 18.0
else语句
while、for 循环可以带一个else语句(可选),如果for,while语句没有被break结束,则会执行else子句,否则不执行。
语法格式:
while 条件表达式:
循环体
else:
语句块
或者:
for 变量 in 可迭代对象:
循环体
else:
语句块
举例:
empNum = 0
salarys = []
for i in range(4):
s = input('请输入员工的薪资(按Q或者q结束):')
if s.upper() == 'Q': # 如果这里键盘输入了Q,那么则执行break,就不会再执行else内的语句
print('录入完成')
break
if float(s) < 0:
print('您输入的小于零,不对')
continue
empNum += 1
salarys.append(float(s)) # 将薪资都添加到列表中
else:
print('四位员工信息已全部录入进去') # 如果将四名员工的工资录入之后,并没有录入q,则不会执行break,这里就会执行else内的语句。
print("员工总数:",empNum) # 求员工总数
print("录入薪资:",salarys) # 打印salary列表
循环代码的优化
- 尽量减少循环内部不必要的计算
- 嵌套循环中,尽量减少内层循环的计算,尽可能的向外提
- 局部变量查询较快,尽量使用局部变量
- 总结: 内层循环的东西尽量往外丢
- 连接多个字符串尽量使用
join()
而不是+
- 列表进行元素的插入和删除,尽量在列表尾部进行操作
zip() 并行迭代
for i in [1,2,3]:
print(i)
print("--------------")
# zip()
names = ("张三","李四","王五")
ages = (18,16,20,25)
jobs = ("老师","程序员","公务员")
for name,age,job in zip(names,ages,jobs): # 依次对应取值
print("{0} -- {1} -- {2}".format(name,age,job))
print("--------------")
for i in range(3):
print("{0} -- {1} -- {2}".format(names[i],ages[i],jobs[i]))
输出结果:
1
2
3
--------------
张三 -- 18 -- 老师
李四 -- 16 -- 程序员
王五 -- 20 -- 公务员
--------------
张三 -- 18 -- 老师
李四 -- 16 -- 程序员
王五 -- 20 -- 公务员
推导式创建序列
推导式是一个或者多个迭代器快速创建序列的一种方法。它可以是将循环和条件判断结合。从而避免冗长的代码。
推导式是典型的Python风格,会使用很重要。
基本语法:
表达式 for item in 可迭代对象
或者:
{表达式 for item in 可迭代对象 if 条件判断}
举例:
>>> [x for x in range(1,5)]
[1, 2, 3, 4]
>>> [x*2 for x in range(1,5)]
[2, 4, 6, 8]
>>> [x*2 for x in range(1,20) if x%5 == 0]
[10, 20, 30]
>>> [a for a in 'abcdefg']
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> cells = [(row,col) for row in range(1,10) for col in range(1,10)] # 可以使用两个循环
>>> cells
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7), (1, 8), (1, 9), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7), (2, 8), (2, 9), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), (3, 7), (3, 8), (3, 9), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (4, 7), (4, 8), (4, 9), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5), (5, 6), (5, 7), (5, 8), (5, 9), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6), (6, 7), (6, 8), (6, 9), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (7, 7), (7, 8), (7, 9), (8, 1), (8, 2), (8, 3), (8, 4), (8, 5), (8, 6), (8, 7), (8, 8), (8, 9), (9, 1), (9, 2), (9, 3), (9, 4), (9, 5), (9, 6), (9, 7), (9, 8), (9, 9)]
>>>
字典推导式:
基本语法:
{key_expresstion : value_expression for 表达式 in 可迭代对象}
类似于列表推导式,字典推导式也可以增加if判断和多个for循环
练习:
统计文本中的字符出现的次数,并生成一个字典:
>>> my_text = 'i love you,i love my family,i love GSH'
>>> char_count = {c:my_text.count(c) for c in my_text}
>>> char_count
{'i': 4, ' ': 7, 'l': 4, 'o': 4, 'v': 3, 'e': 3, 'y': 3, 'u': 1, ',': 2, 'm': 2, 'f': 1, 'a': 1, 'G': 1, 'S': 1, 'H': 1}
>>>
生成器推导式:
这里生成的是一个’生成器对象’,显然,元祖是没有推导式的。
>>> (x for x in range(1,100) if x%9 == 0)
<generator object <genexpr> at 0x109120ac0>
一个生成器对象只能运行一次,第一次迭代可以得到数据。第二次发现数据已经没有了。
>>> gnt = (x for x in range(1,100) if x%9 == 0)
>>> for i in gnt: # 生成器(此时的gnt)是一个可迭代对象
print(i,end = '\t')
9 18 27 36 45 54 63 72 81 90 99
>>> for j in gnt:
print(j)
# 这里什么都没打印 说明生成器推导式只可以用一次,不能用第二次了。
>>>
小练习:
import turtle
t = turtle.Pen()
my_color = ('red','green','yellow','grey')
t.width(4)
t.speed(3)
for i in range(10):
t.penup()
t.goto(0,(-1)*i*10)
t.pendown()
t.color(my_color[i%len(my_color)])
t.circle((i+1)*10)
turtle.done() # 这个方法的意思是程序执行完,窗口仍然存在
输出:
函数
函数的用法和底层分析
把一堆大控制语句包起来就是函数,还可以反复的调用。
函数是可重用的程序代码块。
一个函数(function)就是用来完成一个功能,可以被反复的去掉。
Python中函数有以下几类:
- 内置函数 前面使用的str() list() len()等这些都是内置函数,我们可以直接拿来使用。
- 标准库函数 我们可以通过import导入进来,然后可以使用这些第三方库的函数。
- 用户自定义函数 用户可以自己定义的函数 显然也是开发中适应用户自身需求定义的函数。
函数定义格式:
def 函数名([参数列表]):
"'文档字符串'"
函数体/若干语句
简单的例子:
def test():
print('*'*10)
print('*'*10)
test()
test()
test()
形参和实参
def printMax(a,b): # 此时这里的a,b就是形参 只在函数范围内使用
'''实现两个数的比较,并返回比较大的值'''
if a > b:
print('a大')
if a < b:
print('b大')
# 实参和形参必须一一对应 才能更好的赋值
printMax(12,34) # 此时的12,34就是实参 形参和实参是最基本的概念
文档字符串(函数的注释)
1.'''三个单引号'''
2.#
def printMax(a,b): # 此时这里的a,b就是形参 只在函数范围内使用
'''实现两个数的比较,并返回比较大的值'''
if a > b:
print('a大')
if a < b:
print('b大')
# 实参和形参必须一一对应 才能更好的赋值
printMax(12,34) # 此时的12,34就是实参 形参和实参是最基本的概念
help(printMax.__doc__) # 这里可以输出函数的三个单引号里的说明 __doc__是属性
返回值
- 如果函数中包含return语句,则结束函数执行并返回值
- 如果函数体重不包含return语句,则返回None值
- 要返回多个返回值,我们可以使用列表元祖字典集合将多个值存起来
def print_star(n):
print('*'*n)
def my_avg(a,b):
return (a+b)/2
print_star(5)
re = my_avg(12,34)
print(re)
返回多个值的情况:
def test_01(x,y,z):
return [x*10,y*20,z*30]
print(test_01(12,31,45))
输出:
[120, 620, 1350]