文章目录
控制语句
if
- 条件表达式:逻辑表达式,关系表达式,算术表达式等
条件表达式除了下列情况,全都是True:
Flase,0,0.0,空值None,空序列对象(空列表,空元组,空字符串),空range,空迭代对象 - 语句块: 缩进对齐
Example
a = input("请输入一个数字")
if int(a)<10:
print(a,"比10小")
else:
print(a,"比10大")
####运行结果####
请输入一个数字20
20 比10大
条件语句的应用和判断
if 3:
print("I'm true")
if []:
print()
else:
print("I'm false")
if "":
print()
else:
print("Oh,I'm also false")
####运行结果####
I'm true
I'm false
Oh,I'm also false
条件表达式中不能有赋值等式
错误示范
a = input("输入")
if a = 3 and a < 4:
print("I'm three")
###运行结果###
if a = 3:
^
SyntaxError: invalid syntax
正确示范
因为输入的值不知道是什么类型的,所以判断语句涉及数字的时候一定要转化一下!int(a)
a = input("输入")
if int(a) == 3:
print("I'm three")
else:
print("I'm not three")
三元条件运算符
python 提供了三元运算符,用来在某些简单双分支赋值情况,三元条件运算符语法格式如下:
条件为真时的值 if (条件表达式) else 条件为假时的值
a = input("input")
print(a if int(a) < 10 else "数字太大")
多分支选择结构
Example
a = input("input score:")
grade = ""
if int(a)<60:
grade = "not pass the test"
elif int(a)>= 60 and int(a)<90:
grade = "pass the test"
else:
grade = "Excellent"
#简单写法
print("学生等级是{0}".format(grade))
###运行结果###
input score:80
学生等级是pass the test
选择结构嵌套
a = input("input score:")
grade = ""
if int(a)<90:
if int(a)>80:
grade = "B"
else:
if int(a)>70:
grade = "C"
else:
if int(a)>60:
grade = "D"
else:
grade = "E"
else:
grade = "A"
print("score:{0},grade:{1}".format(a,grade))
### 运行结果 ###
input score:85
score:85,grade:B
循环结构
while
满足条件-循环-再次判断-再次循环-知道不满足条件,退出循环
Example:利用while循环打印0-10的数字
a = 0;
while a<=10:
print(a,end="")
a += 1
###运行结果###
012345678910
计算1-100的累加值
a = 0
b = 0
while a<=100:
b = b + a
a += 1
print(b)
###运行结果###
5050
continue
continue用于结束本次循环,继续下一次,当存在嵌套循环的时候,应用于最近一层循环。
题目:要求输入员工的薪资,若薪资小于0则重新输入。最后打印出录入员工的数量和薪资明细,以及平均薪资
empNum = 0
salary_id = []
salarysum=0
while True:
name = input('please input your name:')
if name.upper() == 'Q':
print("录入完成,退出")
break
salary = input('please input salary:')
if float(salary) < 0:
salary = input('wrong!please input again:')
empNum += 1
salarysum += float(salary)
salary_id.append((name, float(salary)))
print(salary_id)
print(empNum)
print(salarysum/empNum)
####运行结果####
please input your name:r
please input salary:34
please input your name:y
please input salary:78
please input your name:r
please input salary:34
please input your name:u
please input salary:-56
wrong!please input again:56
please input your name:q
录入完成,退出
[('r', 34.0), ('y', 78.0), ('r', 34.0), ('u', 56.0)]
4
50.5
方法二
empNum = 0
salarySum = 0
salarys = []
while True:
s = input("please input your salary")
if s.upper() == 'Q':
print('to sustain')
break
if float(s) < 0:
continue
empNum += 1
salarys.append(float(s))
salarySum += float(s)
print("员工数为:{0}".format(empNum))
else语句
while 条件表达式:
循环体
else:
语块句
else表示跳出循环的运行
for 循环
复习一下字典的取值:
a = {"name":"Di","age":18}
for z in a.keys():
print(z)
for x in a.values():
print(x)
for y in a.items():
print(y)
###运行结果###
name
age
Di
18
('name', 'Di')
('age', 18)
题目:计算0-100累计和,0-100奇数和,0-100偶数和
b = 0
c = 0
d = 0
for i in range(101):
b = b + i
if i % 2 == 0:
c = c + i
else:
d = d + i
print('累计和为{0},偶数和为{1},奇数和为{2}'.format(b, c, d))
####运行结果####
累计和为5050,偶数和为2550,奇数和为2500
嵌套循环
题目1打印如下图案
# 方法1:不用嵌套循环
for i in range(5):
print(" ".join(str(i) * 5))
# 方法2:嵌套循环
for j in range(5):
for k in range(5):
print(j, end="\t")
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
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
题目2:打印九九乘法表
for i in range(10):
for j in range(i + 1):
if i and j:
print(str(i), '*', str(j), '=', i * j, end='\t')
print()
for a in range(1, 10):
for b in range(1, a + 1):
print(str(a), '*', str(b), '=', a * b, 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
题目三:打出字典那一节,大于15000的工资
a = dict(姓名="高小一",年龄= 18 ,薪资= 30000,城市="北京")
b = dict(姓名="高小二",年龄= 19 ,薪资= 20000,城市="上海")
c = dict(姓名="高小三",年龄= 20 ,薪资= 10000,城市="深圳")
tb = [a,b,c]
for x in tb:
if x.get("薪资")>15000:
print(x.get('薪资'))
break 语句
break 语句可用于while和for 循环,用于结束整个循环。当有嵌套循环时,break语句只能跳出最近一层的循环。
找到名字叫q的人就跳出,不输入名字,联想:可以用来寻找错误,找到错误就跳出循环。
while True:
a = input('input')
if a.upper()=='Q':
print('break')
break
else:
print(a)
###运行结果###
input d
d
input QW
QW
input Q
break
循环代码的优化
满足下列条件,可以大大提高运行效率:
- 尽量减少循环内部不必要的计算
- 嵌套循环中,尽量减少内存循环的计算,尽量往外提
- 局部变量查询较快,尽量使用局部变量
第二个方法的验证,看看是不是会快一点
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('耗时:{0}'.format((end-start)))
start1 = time.time()
for i in range(1000):
result = []
c = i*1000
for m in range(10000):
result.append(c+m*100)
end1 = time.time()
print('耗时1:{0}'.format((end1-start1)))
####运行结果####
耗时:2.1927413940429688
耗时1:1.7140562534332275
其他优化手段:
- 连接多个字符串,使用join而不使用*
- 列表进行元素插入和删除,尽量在列表尾部操作
使用zip()进行迭代
- 使用zip()创建字典:
k = ['name','age','job']
g = ['Di','18','student']
d = dict(zip(k,g))
###运行结果###
{'name': 'Di', 'age': '18', 'job': 'student'}
zip函数这种创建方法,只适用于一个表头,一个对象的这种,一个表头多个对象是不能适用的!
a = ['姓名','年龄','薪资','城市']
b = ['高小一',18,'30000','北京']
c = ['高小二',19,'20000','上海']
d = ['高小三',20,'10000','深圳']
e = dict(zip(a,b,c,d))
print(e)
###运行结果###
ValueError: dictionary update sequence element #0 has length 4; 2 is required
但是可以这样创建
#使用zip()进行迭代
names = ('高老一','高老二','高老三','高老四')
ages = (18,19,20,21)
jobs = ('老师','医生','投行人士','营业部部员')
#使用zip
for name,age,job in zip(names,ages,jobs):
print('{0}-{1}-{2}'.format(name,age,job))
#不使用zip的样子
for i in range(4):
print('{0}-{1}-{2}'.format(names[i], ages[i], jobs[i]))
####运行结果####
高老一-18-老师
高老二-19-医生
高老三-20-投行人士
高老四-21-营业部部员
高老一-18-老师
高老二-19-医生
高老三-20-投行人士
高老四-21-营业部部员
推导式创建序列
推导式是从一个或者多个迭代器快速创建序列的一种方法,它可以将循环和条件判断结合,从而避免冗长的代码,推导式是典型的Python风格。
列表推导式
语法:[表达式 for item in 可迭代对象] 或者
[表达式 for item in 可迭代对象 if 条件判断]
print([ x for x in range(1,9) if x%2 == 0])
print([x**2 for x in range(10)])
print([a for a in 'adfweve'])
###运行结果###
[2, 4, 6, 8]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
['a', 'd', 'f', 'w', 'e', 'v', 'e']
两个循环
cells = [[row,col] for row in range(10) for col in range(10) if row % 5==0 and col %4 == 0]
for cell in cells:
print(cell,end='')
### 运行结果 ###
[0, 0][0, 4][0, 8][5, 0][5, 4][5, 8]
字典推导式
格式如下:
{key_expression : value_expression for 表达式 in 可迭代对象}
#字典推导式
#统计一串字符串里面非空字母出现次数
my_text = 'i decide to company with you because i love you'
char_count = {c:my_text.count(c) for c in my_text if c is not ' '}
print(char_count)
###运行结果###
{'i': 4, 'd': 2, 'e': 5, 'c': 3, 't': 2, 'o': 5, 'm': 1, 'p': 1, 'a': 2, 'n': 1, 'y': 3, 'w': 1, 'h': 1, 'u': 3, 'b': 1, 's': 1, 'l': 1, 'v': 1}
如果不用上面那种方法做:
keys = set()
values = []
for a in my_text:
if a is not " ":
keys.add(a)
print(keys)
for b in keys:
values.append(my_text.count(b))
print(values)
char_count1 = dict(zip(list(keys),values))
print(char_count1)
运行结果与上面一致:注意点,不能将用set(values), 因为在用zip以前,values 和keys里面的元素一致,如果set了之后,values的元素会有所减少。
集合推导式
{表达式 for item in 可迭代对象}
或者
{表达式 for item in 可迭代对象 if 条件判断}
元组推导式(生成元组)
a = (x for x in range(10) if x % 2 == 0)
print(a)
print(a.__next__())
print(a.__next__())
print(tuple(a))
####运行结果####
<generator object <genexpr> at 0x0000021AE768FD58>
0
2
(4, 6, 8)
a = (x for x in range(10) if x % 2 == 0)
for x in a:
print(x,end=',')
print(tuple(a))
####运行结果####
0,2,4,6,8,()
综和练习:绘制棋靶和棋盘
import turtle
t = turtle.Pen()
my_color = ('red', 'black', 'green', 'yellow')
for i in range(0, 101, 10):
t.color(my_color[int((i/10) % 4)])
t.circle(i)
t.penup()
t.goto(0, -i)
t.pendown()
turtle.done()
###运行结果###
t = turtle.Pen()
t.goto(0, 0)
t.goto(300, 0)
for i in range(15):
t.penup()
t.goto(0, -(i + 1) * 20)
t.pendown()
t.goto(300, -(i + 1) * 20)
t.penup()
t.goto(0, 0)
t.pendown()
t.goto(0,-300)
for j in range(15):
t.penup()
t.goto((j + 1) * 20,0)
t.pendown()
t.goto((j + 1) * 20,-300)
turtle.done()