Python基础学习-Day_5
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))