您的位置:首页 > 编程语言 > Python开发

Python学习记录_Day009

2018-03-07 20:56 274 查看

今天所学的知识点:

今天复习了一些昨天所学的知识并详细学习了有关列表的基础部分,在过程中引申了堆栈等知识点,所讲不多,但是真特么难,还好,在学习Java时建立了一些基础,略懂略懂~~~~~~首先今天终于想通了昨天的汉罗塔的代码,以及走台阶的代码的思路:

- 汉罗塔移盘:n个盘子从下往上按照大小顺序放置好在一个柱子上(A),旁边还有两个空柱子(B,C),请问把A柱子上的盘子全部移动(一次只能移动一个盘子)到B上,按照和在A上同样的排列顺序排列,且大的盘子不能放在晓得盘子上面,请问需要移动多少次?

代码思路:使用递归算法,要想知道n个盘子需要移动多少次,就需要先知道n-1个盘子需要移动多少次,依次类推,当设计好第一次怎么移动,下一次怎么移动后,知道n次怎么移动了:
def hanoi(n, a, b, c):
hanoi(n-1, a, c, b)
print(a, '---->', b)
hanoi(n-1, c, b, a)

- 走阶梯问题:有10阶台阶,小明每次可以走1,2,3阶,请问小明有多少种走法?

代码思路:使用递归算法,要想知道10次台阶有多少种走法,可以先知道第一次走一阶台阶后9阶台阶有多少种,走2阶台阶后8阶有多少种,走3阶台阶后7阶台阶有多少种,依次类推的总数便是10阶台阶可以走的次数,可得的f(n-1) + f(n-2) + f(n-3)
def walk_stairs(n):
if n < 0:
return 0
elif n == 0:
return 1
return walk_stairs(n - 1) + walk_stairs(n - 2) + walk_stairs(n - 3)
其次是今天所讲的列表的知识点:

1.Python中针对于list的内置函数

def foo():
f1 = ['orange', 'apple', 'banana', 'internationalization', 'blueberry']
# python内置的排序方法默认都升序
# 如果希望排成降序(从大到小)可以通过reverse参数来指定
# Python中的函数几乎都是没有副作用的
# 调用函数之后不会影响传入的参数
f2 = sorted(f1, key=str_len, reverse=True)
print(f1)
print(f2)
f1.sort(reverse=True)
print(f1)
f3 = list(reversed(f1))
print(f3)

def main():
"""
使用枚举的方法对容器进行遍历

:return: 列表的元素
"""
f = [100, 200, 500000]
for index, val in enumerate(f):
print(index, ':', val)
# CRUD操作 Create Read Update Delete
f.append(899)
f.insert(-1, 333) # 有一定的容错性
if 500 in f: # 判断这个容器里有没有这个元素
f.remove(500)
# f.clear()
del f[2] # 知道位置的情况下用del
# print(f.index(100, 3, 5))
print(f.pop()) # 默认把列表元素最后一个删掉,指定元素后元素代指位置
print(f)

if __name__ == '__main__':
main()

2.练习:

设计一个函数计算传入的成绩列表的平均分(去掉一个最高分,去掉一个最低分)
def work_one():
scores = [95, 68, 72, 20, 80, 99, 40]
min_score = max_score = scores[0]
total = 0
for score in scores:
if score > max_score:
max_score = score
elif score < min_score:
min_score = score
total += score
print('最高分:', max_score)
print('最低分:', min_score)
print('去掉一个最高分:%d;去掉一个最低分:%d,平均分:%.1f' % (max_score, min_score, (total - max_score - min_score) / (len(scores) - 2)))
输出结果:
最高分: 99
最低分: 20
去掉一个最高分:99;去掉一个最低分:20,平均分:71.0
在这个代码中要注意,去掉一个最高分,一个最低分后,元素的总数变了。分别录入几个同学的成绩,并判断谁是最高分,谁是最底分
def work_two():
stu_name = ['张三', '李四', '庄王', '赵武', '王超', '马汉', '张龙', '赵虎']
stu_score = []
for i in range(len(stu_name)):
print('请输入%s的成绩:' % stu_name[i], end='')
stu_score.append(int(input()))
num1 = max(stu_score)
num2 = min(stu_score)
f1 = stu_score[:]
f2 = stu_score[:]
while num1 in f1 :
index1 = f1.index(num1)
print('最高分为是%s,一共%d分' % (stu_name[index1], num1))
f1[index1] = '空'
while num2 in f2:
index2 = f2.index(num2)
print('最低分为是%s,一共%d分' % (stu_name[index2], num2))
f2[index2] = '空'
print(stu_score)
输出结果:
请输入张三的成绩:78
请输入李四的成绩:69
请输入庄王的成绩:58
请输入赵武的成绩:92
请输入王超的成绩:92
请输入马汉的成绩:18
请输入张龙的成绩:56
请输入赵虎的成绩:67
最高分为是赵武,一共92分
最高分为是王超,一共92分
最低分为是马汉,一共18分
[78, 69, 58, 92, 92, 18, 56, 67]
本题有一个小细节,就是当最高分或者最低分有多个时,我觉得应该全部都输出,不过很明显,当加入这个条件后,代码量会增加更多,而且为了不改变原始的分数列表,我重新定义了新的列表来判断多个最大数双色球的机选注数
from random import *

def display(balls):
"""
排列列表的格式

:param balls: 列表
"""
for index2, ball in enumerate(balls):
if index2 == len(balls) - 1:
print('|', end=' ')
print('%02d' % ball, end=' ')
print()

def random_select():
"""
生成随机数,并保存进列表
:return: 列表
"""

"""
f0 = [0] * 6
f = [x for x in range(1, 34)]
for i in range(len(f0)):
f0[i] = f[randint(0, len(f) - 1)]
f.remove(f0[i])
f1 = sorted(f0)
f1.append(randint(1, 16))
return f1
"""
red_balls = list(range(1, 34))
select_balls = []
for _ in range(6):
index1 = randrange(0, len(red_balls))
select_balls.append(red_balls[index1])
del red_balls[index1]
select_balls.sort()
select_balls.append(randint(1, 16))
return select_balls

def choice_ball(num):
"""
循环输出机选号数
:param num: 一个非负正整数
:return:
"""
"""
for _ in range(num):
f1 = random_select()
for i in range(len(f1)):
if f1[i] < 10:
f1[i] = '0' + str(f1[i])
print(f1[i], end='   ')
print()
"""
for _ in range(num):
display(random_select())

if __name__ == '__main__':
index = int(input('机选几注:'))
choice_ball(index)
输出结果:
机选几注:5
03 10 15 26 28 32 | 02
01 03 06 12 22 28 | 07
09 14 22 23 24 25 | 09
02 07 12 18 19 26 | 10
01 10 11 14 17 18 | 03
在这个代码中,很明显其实我用了两种方法,不过经过考虑,其实第二种比较好,他分出了多种函数进行不同的步骤,非常好的运用了面向对象的知识.就用我输出的这个结果去买10元钱的彩票,如果后天我没有再发微博了,想必我应该是中大奖了,哈哈哈~~~~~设计一个函数判断第二大元素,且仅使用一个循环
def work_three():
f = [20, 32, 30, 12, 10, 29, 31, 32, 33]
max1 = max(f)
f1 = f[:]
while max1 in f1:
f1.remove(f[f.index(max1)])
if len(f1) != 0:
print(max(f1))
else:
print('没有第二大的元素')
输出结果:
32
在这个代码中需要注意到的是,当最大数不止一个时,应该怎么办!我想到的是,用index()方法找到从左往右第一个最大数,并删除他且需要将删除后的保留到另一个列表中f1(为了防止初始列表的改变,以至于发生不可描述的状况)这样当最大数被删除完了,f1中的最大数,便是f中的第二大元素了

本文结束,谢谢光赏!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: