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中的第二大元素了
本文结束,谢谢光赏!
相关文章推荐
- python学习记录 — (3)条件语句与循环语句
- python学习记录--日期和时间
- python第十天学习记录
- python第二十四天学习记录
- Python学习记录-----批量发送post请求
- python学习记录(2)高级特性
- 举例说明python2.7.X和python3.X以上版本的区别记录学习
- Python学习记录1--简单了解Python
- Python算法实践-学习记录(1)
- Python学习记录-2016-12-15
- python学习记录
- Python 学习记录(一)
- python 2.7.11 + windows 10 连接 mysql学习记录
- Python学习记录——Python函数及对象
- Python学习笔记记录
- Python 学习记录
- python学习记录
- python学习记录
- Python学习记录----IDE安装
- Python学习记录(一)