编程实战
前面3章我们学习了 函数 列表 字典
相关知识。
n以内奇数发现法
#还记得如何定义函数吗 (第5章知识)
def findji(n):
#先定义一个数初始值为1
i = 1
#循环
#重复判断i是不是为奇数,当然i要不断加1
while i < n:
if i % 2 == 1:#判断奇数的方法
print(i)
i = i +1 #别忘记
#没有return
试一下 在线Python
“随机四则运算器"
输出: 打印算式和结果
思路:随机我们可以用random.randint函数
+ - * /
存入一个列表list = ['+', '-', '*', '/']
此时我们用randint函数去随机生成下标(0,1,2,3),再用下标取出运算符
import random #注意import
def rand_jisuan():
a = random.randint(0,100)
b = random.randint(0,100)
list = ['+', '-', '*', '/']
i = random.randint(0,3)
op = list[i]
#现在注意:不能直接用 a op b 的语句哦~(op是个字符串)
if op == '+': #要用if语句
print(str(a) + op + str(b) + "=" + str(a+b))
if op == '-': #要用if语句
print(str(a) + op + str(b) + "=" + str(a-b))
if op == '*': #要用if语句
print(str(a) + op + str(b) + "=" + str(a*b))
if op == '/' and b != 0: #要用if语句,注意b不能等于0
print(str(a) + op + str(b) + "=" + str(a/b))
3/ 假设我们有 地球文 和 外星文的 对照表,如下:(要求实现一个翻译函数从 地球文可以翻译到外星文)
外星文翻译器
for in
语句,后面字符串部分会再讲)for s in "我爱你":
print(s)
def fanyi(zhongwen):
d = {'我':'查', '爱':‘踢’, '你':'岗'}
waixin = '' #建立一个字符串存储外星文
for s in zhongwen:
w = d[s] #查出字典
waixin = waixin + w #把翻译出来的字加到waixin后面
return waixin
试一下 在线Python
如果还不能也没关系,跟着写出之后,可以回头去尝试默写一遍。
下面讲几个跟 循环
if
函数
相关的补充语法,很多时候使用这些语法会方便很多!
你只要有一个印象,之后遇到类似问题可以回来查一查。
1 / break
和 continue
循环
里控制循环的跳出 (while
for
)#break直接跳出循环
#当i=5的时候,退出循环
i = 0
while i < 10:
print(i)
if i == 5:
break
i = i + 1
print("end")
图示
思考一下:这个程序执行会打印什么?(打印 0, 1,2,3,4 之后就跳出了)
试一下 在线Python
#continue跳出当次循环继续下一次
#continue跟break很像
#当i=5的时候,跳出当前循环
i = 0
while i < 10:
if i == 5:
continue
print(i)
i = i + 1
print("end")
图示一下
不知道为什么叫continue
这个名字,总之,continue
不是完全跳出循环,而是跳到循环开头(也就是不执行continue后面的语句)
思考一下:上面的代码。当i == 5
时 continue
会发生什么?(会发生死循环,因为i一直等于5,没机会+1)
试一下 在线Python
修改一下:
#当i=5的时候,跳出当前循环
i = 0
while i < 10:
i = i + 1
if i == 5:
continue
print(i)
print("end")
这次不会死循环
了, 输出 1,2,3,4,6,7,8,9,10 (没有5,因为当i==5时跳过print语句)
试一下 在线Python
2 / if else 分支语法
之前说的 if
,是:“如果”
条件满足,就做xxx
a = 10
if a < 100:
print("a < 100")
if else
表示的意思是 “如果”
条件满足,就做xxx
,否则
就做 yyy
注意哦,if
和 else
两个代码段只会执行1个
a = 10
if a < 100:
print("a < 100")
print("a >= 100")
这次你再思考一下会输出什么?再改一下a=100,由输出什么?
试一下 在线Python
来个图示会更好理解
数据结构
和 算法
组成数据结构
就是文章里的 名词
,算法
就是动词
整数
字符串
浮点数
布尔值
None
列表
字典
我们并不缺表示方法,只是缺少从现实问题设计出合适的 结构
的能力。
比如:如何表示1号线和2号线合起来的地铁线路?( 更多线路先不考虑,太复杂了)
a
b
...
d = {'a':'b', 'b':'c'} #这也是之前的表示方法
换乘站
问题是最关键的。d1 = {'a':'b', 'b':'c'} d2 = {'a1':'b1', 'b1':'c1'}
list = ['复兴门', '建国门']
d1 = {'a':'b', 'b':'c'} #1号线
d2 = {'a1':'b1', 'b1':'c1'} #2号线
huan = ['复兴门', '建国门']
最后,还得考虑一个特殊情况,假设起点和终点在换乘站上,那就需要分别在1,2号线上计算最短路径。
试一下 在线Python
可以定义一个函数 地铁线路最短路径
(解决1条线的最短路径查询)
def ditie_cha(d, start,end): #这里的d是地铁路径
#...
1-2号线最短路径
def ditie_line12(start, end):
#...
d1
d2
只能表示1个方向,还需定义 d10
d20
表示反方向当然最好是有一个函数能转化 d1
d2
-> d10
d20
def ni_d(d): #把d反过来
#...
def ditie_cha(d, start,end): #这里的d是地铁路径
num = 0#刚开始为0
if (start in d) == False or (end in d) == False: #如果不在这条线上
return (None, -1) #-1表示走不到
total = len(d) #计算最多走的站数
next = start
while num < total:
next = d[next]
num = num + 1
if next == end:#如果找到直接返回
return (d[‘fangxiang'], num)
return (None, -1) #找一遍都没有,返回-1
def ni_d(d): #把d反过来
#d={'a':'b','b':'c'}
d1 = {}
for s,n in d.items():
d1[n] = s
return d1
#比较最短路径函数
def min(list):
``
d1 = {'fangxiang':'右','四惠东':'四惠','四惠':'大望路','大望路':'国贸','国贸':'永安里','永安里':'建国门',
'建国门':'东单','东单':'王府井','王府井':'天安门东','天安门东':'天安门西','天安门西':'西单','西单':'复兴路',
'复兴路':'南礼士路','南礼士路':'木樨地'}
d10 = ni_d(d1)
d10['fangxiang'] = '左'
d2 = {'fangxiang':'右','前门':'崇文门','崇文门’:'北京站','北京站':'建国门','建国门’:'朝阳门','朝阳门':'东四十条','东四十条’:'东直门','东直门':'雍和宫','雍和宫’:'安定门','安定门':'鼓楼大街','鼓楼大街’:'积水潭','积水潭':'西直门','西直门’:'车公庄', '车公庄':'阜成门','阜成门':'复兴门','复兴门':'长椿街','长椿街':'和平门','和平门':'前门'}
d20 = ni_d(d2)
d20['方向'] = '左'
huan = ['复兴门', '建国门']
def ditie_line12(start, end):
global fangxiang,huan,d1,d10,d2,d20
#如果正好在换乘站上
if huan.index(start) ! = -1 and huan.index(end) != -1:
#四个路线尝试
f1,n1 = ditie_cha(d1, start, end)
f2,n2 = ditie_cha(d10, start, end)
f3,n3 = ditie_cha(d2, start, end)
f4,n4 = ditie_cha(d20, start, end)
f,n = min([[f1,n1],[f2,n2],[f3,n3],[f4,n4]])
elif start in d1 and end in d1:
f1,n1 = ditie_cha(d1, start, end)
f2,n2 = ditie_cha(d10, start, end)
f,n = min([[f1,n1],[f2,n2])
elif start in d2 and end in d2:
f1,n1 = ditie_cha(d2, start, end)
f2,n2 = ditie_cha(d20, start, end)
f,n = min([[f1,n1],[f2,n2])
else: #最后一种情况就是分别在2条线
...