Python循环结构深入

for循环和可迭代对象遍历

for循环通常用于可迭代对象的遍历。for循环的语法格式如下:

for-变量-in-i可迭代对象:
循环体语句

可迭代对象

Python包含以下几种可迭代对象:
1.序列。包含:字符串,列表,元组
2.字典
3.迭代器对象(iterator)
4.生成器函数(generator)

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: ramon
@file: test_5.py
@time: 2020/11/24
@desc:
"""
for x in "abcdef":
    print(x*2)

a={"name":"阳同学","age":28,"job":"Programer"}
for i in a:
    print(i)
for i in a.keys():
    print(i)
for i in a.values():
    print(i)
for i in a.items():
    print(i)

range对象

range对象是一个迭代器对象,用来生产指定范围内的数字序列。格式为:

range(start,end [step])

生成的数值序列从start开始到end结束(不包含end)。若没有填写start,则默认从0开始。step是可选的步长,默认为1。如下是几种典型示例:

for i in range(10)
产生序列:0,1,2,3,4,5,6,7,8,9
for i in range(3,10)
产生序列:3,4,5,6,7,8,9
for i in range(3,10,2)
产生序列:3,5,7,9

sum_even=0
sum_odd=0
for num in range(101):
    if num%2==0:
        sum_even+=num
    else:sum_odd+=num
    num+=1  #迭代,改变条件表达式,使循环趋于结束
print("1-100所有奇数累加和为",sum_odd)
print("1-100所有偶数累加和为",sum_even)

嵌套循环

一个循环体内可以嵌入另一个循环,一般称为"嵌套循环",或者“多重循环”。
在这里插入图片描述

for x in range(5):
    for y in range(5):
        print(x,end="\t")
    print()

九九乘法表

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=dict(name="yxy1",age=18,salary=30000,city="北京")  #字典
r2=dict(name="yxy2",age=19,salary=20000,city="上海")
r3=dict(name="yxy3",age=20,salary=10000,city="深圳")
tb=[r1,r2,r3] #列表
for x in tb:
    if x.get("salary")>15000:
        print(x)

break语句

break语句用于while和for循环,用于结束整个循环。当有嵌套循环时,break语句只能跳出最近一层的循环。

#测试break
while True:
    a=input("请输入一个字符(输入Q或者q时会退出)")
    if a=="q" or a=="Q":
        print("循环结束,退出")
        break
    else:
        print(a)

continue语句

continue语句用于结束本次循环,继续下一次。多个循环嵌套时,continue也是应用于最近的一层循环。

实操

要求输入员工的薪资,若薪资小于0则重新输入。最后打印出录入员工的数量和薪资明细,以及平均薪资
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: ramon
@file: test_6.py
@time: 2020/11/25
@desc:
"""
empnum=0
salarysum=0
salarys=[]
while True:
    s=input("请输入员工的薪资(按Q或q退出)")
    if s.upper()=='Q':
        print("录入完成,退出")
        break
    if float(s)<0:
        continue
    empnum+=1
    salarys.append(float(s))
    salarysum+=float(s)
print("员工数为{0}".format(empnum))
print("录入薪资:",salarys)
print("平均薪资{0}".format(salarysum/empnum))

else语句

while,for循环可以附带一个else语句(可选)。如果for,while语句没有被break语句结束,则会执行else子句,否则不执行。

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: ramon
@file: test_7_2.py
@time: 2020/12/04
@desc:
"""
salarysSum=0
salarys=[]
for i in range(4):
    s= input("请输入一共4名员工的薪资(按Q或者q中途结束)")
    if s.upper()=='Q':
        print("录入完成,退出")
        break
    if float(s)<0:
        continue
    salarys.append(float(s))
    salarysSum+=float(s)
else:
    print("您已经成功录入4名员工的薪资")
print("录入薪资:",salarys)
print("平均薪资{0}".format(salarysSum/4))

循环代码优化技巧

  • 尽量减少循环内部不必要的计算
  • 嵌套循环中,尽量减少内层循环的计算,尽可能向外提
  • 局部变量查询较快,尽量使用局部变量。
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: ramon
@file: test_7.py
@time: 2020/12/04
@desc:
"""
import time
start= time.time()
for i in range(1000):
    result=[]
    for m in range(10000):
        result.append(i*1000+m*10000)
end=time.time()
print("耗时:{0}".format((end-start)))

start2=time.time()
for i in range(1000):
    result=[]
    c=i*1000
    for m in range(10000):
        q=m*10000
        result.append(c+q)
end2=time.time()
print("耗时:{0}".format((end2-start2)))

其他优化手段

  • 连接多个字符串,使用join()而不使用+
  • 列表进行元素插入和删除,尽量在列表尾部操作

使用zip()并行迭代

我们可以通过zip()函数对多个序列进行并行迭代,zip()函数在最短序列“用完”时就会停止。

#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: ramon
@file: test_7_3.py
@time: 2020/12/04
@desc:
"""
names = ("yxy1", "yxy2", "yxy3")
ages = (18, 19, 20, 21)
jobs = ("医生", "工程师", "摄影师")
for name, age, job in zip(names, ages, jobs):
    print("{0}--{1}--{2}".format(name, age, job))
# 其他方法
for i in range(3):
    print("{0}--{1}--{2}".format(names[i], ages[i], jobs[i]))

推导式创建序列

列表推导式

语法结构:
[表达式-for-item-in-可迭代对象]
或者:
[表达式-for-item-in-可迭代对象-if-条件判断]

# 列表推导式
y = [x * 2 for x in range(1, 50) if x % 5 ==0]
print(y)

y=[]
for x in range(1,50):
    if x%5==0:y.append(x*2)
print(y)

字典推导式

语法结构:
{key_expression:value_expression for 表达式 in 可迭代对象},也可以增加if条件判断,多个for循环。

  • 统计文本中字符出现的次数:
# 字典推导式
my_text='i love you,i love my mother,i love my father'
char_count={f:my_text.count(f) for f in my_text}
print(char_count)

集合推导式

集合推导式生成集合,和列表推导式的语法结构类似:
{表达式-for-item-in-可迭代对象}
或者:
{表达式-for-item-in-可迭代对象-if-条件判断}

#集合推导式
z={x for x in range(1,100) if x%9==0}
print(z)

生成器推导式

生成器推导式只能遍历一次。

#生成器推导式
gnt=(x for x in range(4))
print(gnt)
#print(tuple(gnt)) #生成元组
#print(tuple(gnt)) #第二次无数据,说明生成器只能遍历一次

for x in gnt:   #gnt是生成器,可迭代的对象,只能使用一次
    print(x,end=",")

#同心圆绘制

import turtle
t= turtle.Pen()
for i in range (5):
    t.penup()
    t.goto(0,-i*10)
    t.pendown()
    t.circle(20+i*10)
turtle.done() #程序执行完,窗口仍在

在这里插入图片描述

画棋盘

import turtle
t=turtle.Pen()
width=30
num=18
x1=[(-400,400),(-400+width*num,400)]
y1=[(-400,400),(-400,400-width*num)]

for i in range (0,19):
    t.penup()
    t.goto(x1[0][0],x1[0][1]-30*i)
    t.pendown()
    t.goto(x1[1][0],x1[1][1]-30*i)

for i in range(0,19):
    t.penup()
    t.goto(y1[0][0]+30*i,y1[0][1])
    t.pendown()
    t.goto(y1[1][0]+30*i,y1[1][1])
turtle.done()

在这里插入图片描述

函数用法和底层分析

函数是可重用的程序代码块。函数的作用,不仅可以实现代码的复用,更能实现代码的一致性(只要修改函数的代码,则所有调用该函数的地方都能得到体现)。

python函数的分类

  • 内置函数
    str()、list()、len()等这些都是内置函数,我们可以直接拿来使用。
  • 标准库函数
    我们可以通过import语句导入库,然后使用其中定义的函数
  • 第三方库函数库
    -用户自定义函数

函数的定义和调用

核心要点

Python中,定义函数的语法如下:
def-函数名([参数列表]):
“文档字符串”
函数体/若干语句

要点

  • 使用def来定义函数,然后就是一个空格和函数名称;
    • Python执行def时,会创建一个函数对象,并绑定到函数变量上。
  • 参数列表
    • 圆括号内是形式参数列表,有多个参数则使用逗号隔开
    • 形式参数不需要声明类型,也不需要指定函数返回值类型
    • 无参数,也要保留空的圆括号
    • 实参列表必须与形参列表一一对应
# -*- coding:utf-8 _*-
"""
@author: ramon
@file: function_1.py
@time: 2020/12/08
@desc:
"""
#测试函数的定义与调用
def test01():
    print("yxy"*2)
    print("wj"*2)
print(test01)
print(id(test01))
print(type(test01))
test01()
for i in range(5):
    test01()
形参和实参

形参用于定义的时候,实参用于调用的时候

def printMin(a,b):
    if a<b:
        print(a,"最小值")
    else:
        print(b,"最小值")
printMin(50,100)
printMin(10,5)
返回值

要点

  • 如果函数体中包含return语句,则结束函数执行并返回值;
  • 如果函数体中不包含return语句,则返回None值。
  • 要返回多个返回值,使用列表、元组、字典、集合将多个值“存起来”即可。
#测试返回值的基本用法
def add(a,b):
    return a*2+b*2
c=add(10,30)
def test():
    print("hello,world")
    print("plus")
    return  #两个作用:1.返回值     2.结束函数的执行
    print("!!!")
#多个返回值
def test02(x,y,z):
    return [x+5,y+6,z+7]
print(c)
test()
print(test02(10,11,12))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值