Python基础篇——Day5
for循环和可迭代对象遍历
for循环
for循环通常用于可迭代对象的遍历,语法:
for 变量 in 可迭代对象:
循环语句
可迭代对象
Python包含以下几种可迭代对象:
- 序列。包含:字符串、列表、元组
- 字典
- 迭代器对象(iterator)
- 生成器函数(generator)
- 文件对象
操作示例:
'''
对字符串进行遍历
'''
for x in 'abcd':
print(x)
'''
结果为:
a
b
c
d
'''
'''
对字典进行遍历
'''
d={'a':100,'b':200}
for x in d:
print(x)
'''
结果为:
a
b
默认将字典的键对象打印出来
'''
'''
对字典值键、值、键值对分别进行遍历
'''
#对键遍历
for x in d.keys():
print(x)
#对值遍历
for x in d.values():
print(x)
#对键值对遍历
for x in d.items():
print(x)
range对象
range是一个迭代器对象,用来产生指定范围的数字序列,格式为:
range(start,end,step)
生成的序列从start开始到end结束,不包含end,若未填写start,则默认为0。步长step的默认值为1
操作示例:
'''
计算1-10的累加和,奇数累加和,偶数累加和
'''
sum_all=0
sum_odd=0
sum_even=0
for i in range(101):
# 求总和
sum_all=sum_all+i
# 求偶数和
if i%2==0:
sum_even=sum_even+i
# 求奇数和
else:
sum_odd=sum_odd+i
for循环嵌套
操作示例:
'''
打印5行5列表格,每行数字为(行号-1)
'''
for i in range(5):
for j in range(5):
print(i,end="\t") # 不换行打印,打印5次
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 i in range(1,10):
for j in range(1,i+1):
print("{0}*{1}={2}".format(i,j,i*j),end="\t")
print()
'''
结果为:
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和continue语句
break语句
break语句可用于while和for循环,用来结束整个循环,当有嵌套循环时,break语句仅仅跳出最近一层的循环
操作示例:
while True:
num=int(input("enter an integer: "))
if num==1:
break
'''
上述例子中,若输入的整数为1,则跳出整个while循环
'''
for i in range(3):
for j in range(4):
if j==2:
break
'''
上述例子中,若j取值为2,则跳出最近一层for循环,即for j in range(4),然后最外层循环开始新的一轮运行,
即,若跳出时的i为1,则开始新一轮循环时的i为2
'''
continue语句
continue语句用于结束本次循环,继续下一次循环,多个循环嵌套时,continue语句也是应用于最近一层的循环
操作示例:
for i in range(3):
for j in range(4):
if j==2:
print("not ok")
continue
print("ok")
'''
上述例子中,若j取值为2,则当前最近一层的循环结束,马上开始下一次循环,即当j取值为2时,for j循环打印出
not ok后循环结束,将不会执行打印ok的操作,随后马上开始下一次循环,此时j为3
'''
else语句
Python的while,for循环可以附带一个else语句(作为可选项)。如果for,while语句没有被break语句结束,则会执行else语句,否则不执行。语法格式如下:
while 条件表达式:
循环体
else:
语句块
或者
for 变量 in 可迭代对象:
循环体
else:
语句块
操作示例;
'''
4名员工,录入这4人的薪资,全部录入后,将提示“您已完成录入操作”
'''
salarySum=0
salarys=[]
for i in range(4):
s=float(input("enter the salary of an employee(enter Q or q to quit)"))
if s.upper()=='Q':
print("the work is done,thanks!")
break
if s<0:
print("salary cannot be less than 0, please re-enter it")
continue
salarys.append(s)
salarySum+=s
else:
print("the work is done, thanks!")
print("the salaries for the 4 members are ",salarys)
print("the average salary is ",salarySum/4)
'''
上述例子中,若不输入Q或q,则输入完全部4名员工薪资后(for 循环结束后),程序将执行else语句块并打印出
the work is done, thanks!
'''
循环代码优化
原则
遵守以下三个原则可大大提高运行效率,避免不必要的低效计算:
- 尽量减少循环内部不必要的计算,能放到循环外面的尽量放到外面
- 嵌套循环中,尽量减少内层循环的计算,尽可能向外提
- 尽量使用局部变量,因为其查询较快
操作示例:
import time
start1=time.time()
for i in range(1000):
result=[]
for m in range(10000):
result.append(i*1000+m*100)
end1=time.time()
print("耗时1:{0}".format(end1-start1))
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("耗时2:{0}".format(end2-start2))
'''
上述例子中,第二个示例将i*1000的操作提到内层循环外进行,这样的操作可节约总计算时间,其结果为:
耗时1:2.3127858638763428
耗时2:2.106515884399414
'''
其它优化手段
- 连接多个字符串,使用join()方法而不是"+"
- 列表进行元素的插入和删除,尽量在列表尾部进行
推导式创建序列
列表推导式
基本语法:
[表达式 for item in 可迭代对象] 或者
[表达式 for item in 对迭代对象 if 条件判断]
操作示例:
[x for x in range(5)]
'''
结果为:[0, 1, 2, 3, 4]
'''
'''
也可以使用两个循环
'''
cells=[(row,col) for row in range(3) for col in range(3)]
'''
结果为:[(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]
'''
字典推导式
基本语法:
{key_expression: value_expression for 表达式 in 可迭代对象}
类似于列表推导式,字典推导式也可以用if条件判断,并用多个for循环嵌套
操作示例:
myText="i love u, i love python"
char_count={c:myText.count(c) for c in myText}
'''
结果为:
{'i': 2, ' ': 5, 'l': 2, 'o': 3, 'v': 2, 'e': 2, 'u': 1, ',': 1, 'p': 1, 'y': 1, 't': 1, 'h': 1, 'n': 1}
集合推导式
集合中所有元素都是字典的键对象,基本语法:
{表达式 for item in 可迭代对象} 或者
{表达式 for item in 可迭代对象 if 条件判断}
生成器推导式(生成元组)
返回的不是元组,而是一个生成器对象
操作示例:
(x for x in range(1,100) if x%9==0)
'''
会返回一个生成器对象,结果为:
<generator object <genexpr> at 0x000001F25015C570>
'''
由此可见,元组是没有推导式的
一个生成器只能运行一次,第一次迭代可以得到数据,第二次迭代就发现数据已经没有了
操作示例:
a=(x for x in range(1,100) if x%9==0)
b=list(a)
>>b
[9, 18, 27, 36, 45, 54, 63, 72, 81, 90, 99]
c=list(a)
>>c
[]
函数的定义和调用:
基本语法:
def 函数名([参数列表]):
‘’‘文档字符串’’’
函数体/若干语句
要点:
- Python执行 def 时,会创建一个函数对象,并将其地址赋予函数名变量
- 圆括号内是形式参数列表,有多个参数则使用逗号隔开
- 形式参数不需要声明类型,也不需要指定函数返回值类型
- 无参数,也必须保留圆括号
- 实参列表必须与形参列表对应
形参和实参
操作示例:
def add(a,b):
return a+b
'''
上述例子中,a,b称为形式参数,简称形参,也就是说,形参是在函数定义时使用的,形参的定义需符合标识符命名规则
'''
'''
在调用函数时,传递的参数被称为实参,如add(10,20),10和20就是实参
'''
标识符命名规则重温
原则:
- 标识符由字母,数字,下划线组成,且不能以数字开头
- Python标识符区分大小写
- Python标识符不能使用关键字
建议:
- 见名知义,取一个有意义的标识符名称
- 在为Python变量命名时,建议类名以大写字母开头的单词命名(如HelloWorld),模块名用小写字母加下划线的方式命名(如low_with_under)
文档字符串
操作示例:
def add(a,b):
'''用于返回a与b的和'''
return a+b
# 上述例子中,两个连续“三个单引号”之间的字符串称为文档字符串,若想查看某函数的文档字符串,
# 可通过help(函数变量名.__doc__)方法获取,如help(add.__doc__)
返回值
return返回值要点:
- 如果函数体包含return语句,则结束函数执行并返回值
- 如果函数体中不包含return语句,则返回None值
- 要返回多个值,可使用列表,元组,字典,集合等将需要返回的值存起来,等最后一起返回