通常用于可迭代对象的遍历,for循环的语法格式如下:
for 变量 in 可迭代对象:
循环体语句
Python中的可迭代对象:
1.序列。包含:字符串、列表、元组
2.字典
3.迭代器对象( iterator)
4.生成器函数( generator)
我们已经在前面学习了序列、字典等,迭代器对象和生成函数将在后面进行详解。接下来,我们通过循环来遍历这几种类型的数据:
【操作1】遍历字符串
for x in list('daxian'):
print(x)
【操作2】遍历字典
d = {
'name':'gaoqi','age':18,'address':'beijing'}
#遍历键
for a in d:
print(a)
#遍历键
for a in d.keys():
print(a)
#遍历键值
for a in d.values():
print(a)
#遍历键值对
for a in d.items():
print(a)
range对象是一个迭代器对象,用来产生指定范围的数字序列。
格式为:
range(start, end, [Step])
生成的数值序列从start开始到end结束(不包含end,左闭右开的一个区间)。若没有填写 start,则默认从0开始。step是可选的步长,默认为1。
【操作】计算1-100之间数字的累加和,偶数的累加和,奇数的累加和
sum_all = 0
sum_odd = 0 #奇数和
sum_even = 0 #偶数和
for i in range(101):
sum_all += i
for i in range(0,101):
if i % 2 == 1:
sum_odd += i
for i in range(101):
if i % 2 == 0:
sum_even += i
print("和:{0};奇数和:{1};偶数和:{2}".format(sum_all,sum_odd,sum_even))
一个循环体内可以嵌入另一个循环,一般称为“嵌套循环”,或者“多重循环”
for i in range(5):
for j in range(5):
print(i,end = "\t")
print("\n")
for m in range(1,10):
for n in range(1,m+1):
print("{0}*{1}={2}".format(m,n,m*n),end = '\t')
print()# 换行
#用列表和字典存储信息
r1 = {
'name':'阿大','age':18,'salary':30000,'city':'BJ'}
r2 = {
'name':'阿二','age':19,'salary':20000,'city':'SH'}
r3 = {
'name':'阿三','age':20,'salary':10000,'city':'SZ'}
tb = [r1,r2,r3]
#打印出表中工资高于15000的人的信息
for r in tb:
if r.get('salary') > 15000:
print(r)
get()可以得到某个键的值,value()得到所有键值,注意区分。
break语句可用于While和for循环,用来结束整个循环,当有嵌套循环时, break语句只能跳出最近一层的循环
【操作】使用break语句:输入字符串并打印,当输入Q或者q时停止输入
while True:
a = input("请输入一个字母:")
if a.upper() == 'Q': #a == 'q' or a == 'Q'
print('退出循环')
break
else:
print(a)
continue语句用于结束本次循环继续下一次。多个循环嵌套时, continue也是应用于最近的一层循环
【操作】要求输入员工的薪资。若薪资小于0,则重新输入,最后打印出录入员工的数量和薪资明细,以及平均工资。输入q或者Q时结束
empSum = 0
salarySum = 0
salary = []
while True: #一直监听输入
s = input('请输入员工薪资(输入Q或者q时结束):')
if s.upper() == 'Q': #当输入q or Q 结束循环打印结果
print("录入结束")
break
if float(s) < 0: #s小于0时,跳出本次循环继续输入
continue
empSum += 1
salary.append(s)
salarySum += float(s)
print("员工总数是{0}人".format(empSum))
print("录入薪资:{0}".format(salary))
print('平均工资:{0}'.format(salarySum/empSum))
当前层循环全部执行完毕后执行
while、for循环可以附带一个else语句(可选)。如果for、whie语旬没有被 break语句结束,则会执行else子句,否则不执行。
语法格式如下:
whle条件表达式:
循环体
else:
语句块
或者:
for 变量 in 可迭代对象:
循环体
else:
语句块
【操作】要求输入4名员工的薪资,若薪资小于0则重新输入。最后打印出录入员工的数量和薪资明细,以及平均薪资
salarysum = 0
salary = []
for i in range(4):
s = input('请输入员工薪资(输入q或者Q时结束):')
if s.upper() == 'Q':
break
if float(s) < 0:
continue
salary.append(s)
salarysum += float(s)
else:
print('您已全部输入了四名员工工资')
print('录入薪资:{}'.format(salary))
print('平均工资:{}'.format(salarysum/4))
虽然计算机越来越快,空间也越来越大,我们仍然要在性能问题上“斤斤计较”。
编写循环时,遵守下面三个原则可以大大提高运行效率,避免不必要的低效计算:
1.尽量减少循环内部不必要的计算
2.嵌套循环中,尽量减少内层循环的计算,尽可能向外提
3.局部变量查询较快,尽量使用局部变量
循环代码优化测试
import time
start = time.time()
for i in range(1000):
result = []
for m in range(10000):
result.append(i*1000+m*100)
end = time.time()
print('耗时:{}'.format(end-start))
start2 = time.time()
for i in range(1000):
result = []
c = i*1000
for m in range(10000):
result.append(c+m*100)
end2 = time.time()
print('耗时:{}'.format(end2-start2))
其他优化手段:
1.连接多个字符串,使用join()而不使用+
2.列表进行元素插入和删除,尽量在列表尾部操作
我们可以通过zip()函数对多个序列进行并行迭代,zip()函数在最短序列“用完“时就会停止
zip()测试
name = ('大仙','二仙','三仙','四仙')
age =(18,19,20,21)
job = ('老师','公务员','程序员')
#利用传统的方式遍历
for i in range(3):
print('{0}--{1}--{2}'.format(name[i],age[i],job[i]))
#利用zip()函数遍历,最短序job用完就会停止循环
for name,age,job in zip(name,age,job):
print('{0}--{1}--{2}'.format(name,age,job))
推导式是从一个或者多个迭代器快速创建序列的一种方法。它可以将循环和条件判断结合,从而避免冗长的代码。推导式是典型的 Python风格,会使用它代表你已经超过 Python初学者的水平。
列表推导式生成列表对象,语法如下:
[表达式 for item in 可迭代对象]
或者:{表达式 for item in 可迭代对象 if 条件判断}
#生成1-10的偶数列表
y = []
for x in range(1,6):
y.append(x*2)
print(y)
y = [x*2 for x in range(1,6)]
print(y)
#使用条件判断取出自己想要的数
y =[x*2 for x in range(1,20) if x%5 ==0 ]
print(y)
#实现嵌套循环--取出坐标值
cells = [(cell,row) for cell in range(1,10) for row in range(1,10)]
cells = [(cell,row) for cell in range(1,10) if cell%2 == 0 for row in range(1,10) if row%2 ==0]
print(cells)
字典的推导式生成字典对象,格式如下:
{key_expression:value_expression for 表达式 in 可迭代对象}
类似列表推导式,字典推导也可以增加if条件判断、多个for循环嵌套。
统计文本中字符出现的次数
my_text = 'i love you,i love sxt,i love daxian'
# for循环取出每一个字母,做成key,然后计算文本中每个字符出现的次数,放到对应的key中
char_c = {
c:my_text.count(c) for c in my_text}
print(char_c)
用普通循环该怎么实现呢
my_text='i love you, i love sxt,i love gaoqi'
list=[]
count_list=[]
for i in my_text:
if i not in list:
list.append(i)
count = my_text.count(i)
count_list.append(count)
dict1=zip(list,count_list)
集合推导式生成集合,和列表推导式的语法格式类似:
{表达式 for item in 可迭代对象}
或者:{表达式 for item in 可迭代对象 if条件判断}
#取出1-100里能被9整除的数作为key
a = {
x for x in range(1,100) if x%9 == 0}
print(a)
那么:“其他序列都有推导式,元组有没有?″,能不能用小括号呢?来试一下
>>> (x for x in range(1,100) if x%9 == 0)
<generator object <genexpr> at 0x1118031d0>
由此可知,提示的是一个”生成器对象“,说明元组是没有推导式的
生成器只能用一次,第一次迭代可以得到数据,第二次迭代发现数据已经没有了。
生成器就是可迭代对象
a = (x for x in range(1,100) if x%9 ==0)
print(a)
print(tuple(a))
print(tuple(a))
#初始化
import turtle
t = turtle.Pen()#生成一个画笔
t.width(2)#宽度
my_color = ('red','yellow','black','green','blue')
t.speed(0)#速度
for i in range(10):
t.penup()
t.goto(0,-i*20)
t.pendown()
t.color(my_color[i%len(my_color)])
t.circle(20+i*20)
turtle.done()#程序执行完毕窗口仍然存在
#初始化
import turtle
t = turtle.Pen()#生成一个画笔
t.speed(0)#速度
#棋盘每个格子宽度是10
for i in range(0,181,10):#画竖线
t.goto(i,0)#起点
t.pendown()
t.goto(i,180)#终点
t.penup()
t.goto(0,0)
for i in range(0,181,10):#画横线
t.goto(0,i)
t.pendown()
t.goto(180,i)
t.penup()
turtle.done()#程序执行完毕窗口仍然存在
函数是可重用的程序代码块。函数的作用,不仅可以实现代码的复用,更能实现代码的一致性。一致性指的是,只要修改函数的代码,则所有调用该函数的地方都能得到体现。
在编写函数时,函数体中的代码写法和我们前面讲述的基本一致,只是对代码实现了封装,并增加了函数调用、传递参数、返回计算结果等内容。
为了让大家更容易理解,掌握的更深刻。我们也要深入内存底层进行分析。绝大多数语言内存底层都是高度相似的,这样大家掌握了这些内容也便于以后学习其他语言。
1.一个程序由一个个任务组成:函数就是代表一个任务或者一个功能
2.函数是代码复用的通用机制
Python中函数分为如下几类
1.内置函数
我们前面使用的str()、ist()、len()等这些都是内置函数,我们可以拿来直接使用
2.标准库函数
我们可以通过 Import语句导入库,然后使用其中定义的函数
3.第三方库函数
Python社区也提供了很多高质量的库。下载安装这些库后,也是通过 Import语句导入,然后可以使用这些第三方库的函数
4.用户自定义函数
用户自己定义的函数,显然也是开发中适应用户自身需求定义的函数。今天我们学习的就是如何自定义函数。
python中,定义函数的语法如下:
def 函数名(参数列表):
‘’‘文档字符串(对函数的说明)’’’
函数体
return 返回值
def test01():
print('aaa',end = '\n')
for i in range(5):
test01()
要点
1.我们使用def来定义函数,然后就是一个空格和函数名称;
(1) Python执行def时,会创建一个函数对象(存在堆内),并绑定到函数名变量上(test01变量存在栈上)
2.参数列表
(1)圆括号内是形式参数列表,有多个参数则使用逗号隔开
(2)形式参数不需要声明类型,也不需要指定函数返回值类型
(3)无参数,也必须保留空的圆括号
(4)实参列表必须与形参列表—对
3.return返回值
(1)如果函数体中包含 return语句,则结束函数执行并返回值;
(2)如果函数体中不包含 return语句,则返回None值。
4.调用函数之前,必须要先定义函数,即先调用def创建函数对象
(1)内置函数对象会自动创建
(2)标准库和第三方库函数,通过import导入模块时,会执行模块中的def语句
(1)def 函数名():圆括号内是形式参数列表,有多个参数则使用逗号隔开
(2)形式参数不需要声明类型,也不需要指定函数返回值类型
(3)无参数,也必须保留空的圆括号
(4)实参列表必须与形参列表—对
【操作】定义一个函数,比较两个数的大小,并返回最大值
def printMax(a,b):
if a > b:
print(a)
if a < b:
print(b)
if a == b:
print('相等')
printMax(10,20)
printMax(20,20)
上面的 printMax的数中,在定义时写的printMax(a,b),a和b称为“形式参数”,简称“形参,也就是说,形式参数是在定义函数时使用的,形式数的命名只要符合标识符”命名规更即可。
在调用函数时,传递的参数称为“实际参数”,简称“实参”,上面代码中printMax(10,20),10和20就是实际参数
形参:定义时---------实参:调用时
程序的可读性最重要,一般建议在函数体开始的部分附上函数定义说明,这就是“文档字符串”,也有人成为函数的注释”,我们通过三个单引号或者三个双引号来实现,中间可以加入多行文字讲行说明。
【操作】测试文档字符串的使用:根据传入的n,打印多个n星号
def print_star(n):
'''根据传入的n,打印多个n星号'''
print("*"*n)
help(print_star) #我们调用help(函数名.__doc__)可以打印输出函数的文档字符串
输出结果:
Help on function print_star in module main:
print_star(n)
return返回值要点:
1.如果函数体中包含 return语句,则结束函数执行井返回值
2.如果函数体中不包含 return语句,则回None值
3.要返回多个返回值,使用列表、元组、字典合将多个值‘存起来’”即可。
【操作一】定义一个返回两个数平均值的函数
def my_avg(a,b):
return (a+b)/2
#函数的调用
c = my_avg(20,30)
print(c)
def test03(x,y,z):
return [x*10,y*10,z*10]
print(test03(1,2,3))