python夯实基础日记-for循环、优化技巧、函数

057.for循环结构_遍历各种可迭代对象_range对象

for循环

通常用于可迭代对象的遍历,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对象是一个迭代器对象,用来产生指定范围的数字序列。

格式为:
range(start, end, [Step])

生成的数值序列从start开始到end结束(不包含end,左闭右开的一个区间)。若没有填写 start,则默认从0开始。step是可选的步长,默认为1。

如下是几种典型示例:
python夯实基础日记-for循环、优化技巧、函数_第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))

058.嵌套循环

一个循环体内可以嵌入另一个循环,一般称为“嵌套循环”,或者“多重循环”

【操作一】:打印如下图案

python夯实基础日记-for循环、优化技巧、函数_第2张图片

for i in range(5):
    for j in  range(5):
        print(i,end = "\t")
    print("\n")

【操作二】:打印九九乘法表

python夯实基础日记-for循环、优化技巧、函数_第3张图片

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()# 换行

【操作三】:用列表和字典存储下表信息,并打印出表中工资高于15000的人的信息

python夯实基础日记-for循环、优化技巧、函数_第4张图片

#用列表和字典存储信息
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()得到所有键值,注意区分。

60.break语句(结束最近一层循环)

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)

61.continue语句(打断本次循环)

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))

62.else语句

当前层循环全部执行完毕后执行

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))

63.循环代码优化技巧(非常重要!!!)

虽然计算机越来越快,空间也越来越大,我们仍然要在性能问题上“斤斤计较”。
编写循环时,遵守下面三个原则可以大大提高运行效率,避免不必要的低效计算:

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.列表进行元素插入和删除,尽量在列表尾部操作

64.zip()并行迭代

我们可以通过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))

65.推导式创建序列_列表推导式_字典推导式_集合推导式_生成器推导式(多花点时间)

推导式创建序列

推导式是从一个或者多个迭代器快速创建序列的一种方法。它可以将循环和条件判断结合,从而避免冗长的代码。推导式是典型的 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)

集合(只有key,没有value)推导式

集合推导式生成集合,和列表推导式的语法格式类似:

{表达式 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))

66.综合练习_绘制不同颜色的多个同心圆_绘制棋盘

绘制不同颜色的同心圆

#初始化
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()#程序执行完毕窗口仍然存在

画18*18的棋盘

#初始化
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()#程序执行完毕窗口仍然存在

python夯实基础日记-for循环、优化技巧、函数_第5张图片

67.函数的基本概念_内存分析_函数的分类_定义和调用

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

在编写函数时,函数体中的代码写法和我们前面讲述的基本一致,只是对代码实现了封装,并增加了函数调用、传递参数、返回计算结果等内容。

为了让大家更容易理解,掌握的更深刻。我们也要深入内存底层进行分析。绝大多数语言内存底层都是高度相似的,这样大家掌握了这些内容也便于以后学习其他语言。
python夯实基础日记-for循环、优化技巧、函数_第6张图片

函数简介

函数的基本概念

1.一个程序由一个个任务组成:函数就是代表一个任务或者一个功能

2.函数是代码复用的通用机制

Python函数的分类

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变量存在栈上)
python夯实基础日记-for循环、优化技巧、函数_第7张图片
2.参数列表
(1)圆括号内是形式参数列表,有多个参数则使用逗号隔开
(2)形式参数不需要声明类型,也不需要指定函数返回值类型
(3)无参数,也必须保留空的圆括号
(4)实参列表必须与形参列表—对

3.return返回值
(1)如果函数体中包含 return语句,则结束函数执行并返回值;
(2)如果函数体中不包含 return语句,则返回None值。

4.调用函数之前,必须要先定义函数,即先调用def创建函数对象
(1)内置函数对象会自动创建
(2)标准库和第三方库函数,通过import导入模块时,会执行模块中的def语句

68.形参和实参_文档字符串(函数注释)

形参和实参

(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)

python夯实基础日记-for循环、优化技巧、函数_第8张图片

上面的 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)

69.返回值详解

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))

你可能感兴趣的:(基础知识,循环及其优化技巧,函数,python)