Python基础检测:20171105
第一周的预习结束了
效果并不理想,最后的检测也是有个别同学表现还可以.最后一次检测,除了依旧不是放在一个文件里,文件也没有标注作者从而导致我没办法一一回复外,有些问题写的不好意外.基本没什么毛病,摔!
本次问题是以小故事的形式展开并串联的,并没有什么特殊的意思.本人不善言谈,更不善于搭讪.拒撩.
答案与解析
第一题,公式转换,计算误差
# 1. 门前有两棵树,其中一棵是枣树,我每天早上起来都会吃掉原三分之一又一个枣,一个星期刚好吃完,请问我一共吃了几个枣? (循环)
def question_1(n=7):
from fractions import Fraction
x = 0
for day in range(n, 0, -1):
print("星期", day, "过完后剩下", x, "颗枣")
x = (x + 1) /Fraction(2,3) # 使用分数,避免因为数值精度产生误差
print("那么,第一天开始的时候就有:", x, "颗枣")
这道题的没什么难点,而且每个问题都给出了解题思路.从答题看,该题目主要有两个问题,一个是公式问题,简单来说(列一元方程,未知数转换到公式一侧.)然后没了,要是不会,我也没有办法.这可能不是适不适应我的节奏的问题,可能是适不适合编程的问题.第二,是数值精度的问题,因为问题求解中需要计算小数,而且连乘较多,不使用分数计算会导致误差在连乘过程中不断增加.
第二题,yield关键字
# 2. 另一个树也是枣树,一不小心打落了距离地面三米六一个枣,枣掉在地上,弹了起来,弹起来的距离是下落距离的1/2,,第十次弹起了多高?(用yield)
def length(n):
l = 3600
while n > 0:
l = l / 2
yield l
n -= 1
# print(l)
def question_2():
print(list(length(10))[9])
之前的斐波那契数列已经有过了,不会的话,就反省一下是不是自己偷懒了
第三题,屏幕输入输出
# 3. 我枣吃多了肚子疼去医院看病,护士问我名字和性别对我说,"你好,XX先生/XX女士" (人机交互)
def question_3(bl_test=False, name="FontTian", sex='1'):
if bl_test:
name = input("名字?")
sex = input("性别?")
else:
pass
if sex in ['男', '1']:
sex = '先生'
else:
sex = '女士'
print("你好 ,%s%s" % (name, sex))
以前多次写过的,不会的还是反省一下自己是不是偷懒了吧.语法相对简单,到时我给的提示可能让之前没有留意前两次实例的人混淆……
第四题
我给出的是扩展的写法,使用了exec方法,实现这个
# 4. 医生给我开了药房,我把药方拿给护士小姐姐,拿药,付钱的时候小姐姐需要一个计算器(计算机,加减乘除,exit退出)
# 不考虑异常
# def question_4():
while True:
x = input("变量1\n")
if x == "exit":
break
y = input("运算符号\n")
z = input("变量2\n")
exec("ans = " + x + y + z)
import time
time.sleep(3)
print(ans)
或者使用choice关键字也可以,这个其实才是最简单一个,因为是choice的教学例子,在各种地方也最为常见,除非没学:
def add(x, y):
return x + y
def subtract(x, y):
return x - y
def multiply(x, y):
return x * y
def divide(x, y):
return x / y
print("选择运算:")
print("1、相加")
print("2、相减")
print("3、相乘")
print("4、相除")
choice = input("输入你的选择(1/2/3/4):")
num1 = int(input("输入第一个数字: "))
num2 = int(input("输入第二个数字: "))
if choice == '1':
print(num1,"+",num2,"=", add(num1,num2))
elif choice == '2':
print(num1,"-",num2,"=", subtract(num1,num2))
elif choice == '3':
print(num1,"*",num2,"=", multiply(num1,num2))
elif choice == '4':
print(num1,"/",num2,"=", divide(num1,num2))
else:
print("非法输入")
第五题
存储文件,老问题了,之前也考过一次,算是复习
# 5. 护士小姐姐温柔又漂亮,所以我和小姐姐要了手机号,我赶紧把手机号存了起来(输入你的手机号,并存入txt文件)
def question_5():
MP = input("小姑娘,你很漂亮,能留个联系方式吗?\n") # 突然发现,原来我不会搭讪......
with open("/home/fonttian/Data/17_DS_AI/20171103_MP.txt", "w") as f:
f.write(MP)
第六题
考逻辑,双层循环解决.
# 6. 回家之后,我摆弄着我的药,我先把他们办成了一个3*4 的矩阵,又变成了4*3 的矩阵,然后又摆了回来
def question_6():
print("将3*4 矩阵 转化为 4*3 矩阵")
martrix = [
[1, 2, 3, 4],
[5, 4, 6, 2],
[9, 10, 12, 15]
]
print([[row[i] for row in martrix] for i in range(4)])
第七题
# 7. 狗狗在一边看着我,似乎他明白了我是在犹豫,要不要给护士小姐姐打电话,所以狗狗用爪子轻轻地摆弄着我的手机,似乎是在鼓励我
# 于是我拿起手机(调用电话类),输入电话号码(传入参数),彩铃响起,是小星星(屏幕输出小星星,双层循环)
"""
*
***
*****
*******
*****
***
*
"""
还是双层循环,没什么意思.但是比较考逻辑,往往阵亡在逻辑上的人不少
低级程序员看调用,中级程序员看逻辑,高级程序员看数学.
def question_7(n=3):
n = 3
for i in range(2):
for j in range(n):
if i == 0:
print(" " * (n + 1 - j) + "*" * ((j + 1) * 2 - 1))
if j == (n - 1):
print(" " + "*" * ((j + 2) * 2 - 1))
else:
# print(" " * (j) + "*" * ((j + 1) * 2 - 1))
print(" " * ((j + 1) + 1) + "*" * ((n - j) * 2 - 1))
第八题
# 8. 然而电话并没有人接,我失望地放下手机.似乎有点饿,于是我打开冰箱
"""
我从上到下依次用我的24k钛合金狗眼扫描冰箱,一共发现了
[1,4,5,2,4,87,32,45,23,56,4,6,9,45,56,5,4,2,1,1,32,34,23,32]这些物品
请问我冰箱里一共有多少种不同的物品?
list,set转换获取
"""
def question_8(list=[1, 4, 5, 2, 4, 87, 32, 45, 23, 56, 4, 6, 9, 45, 56, 5, 4, 2, 1, 1, 32, 34, 23, 32]):
print(len(set(list)))
list,set转换与其性质的问题,基本功属于知识储备层的问题.就算是看了一眼没想起来,百度一下总会会的,和前面的几道题一样,其实都是送分题,不会做,只是证明了,之前的努力要么不够要么路子不对.
第九题
# 9. 我最终从冰箱中拿出了[1,4,6,9,45,56]号食物,请问,我把他们放在一个盘子里,然后又把他们的顺序反了过来,但是只用了一个盘子(数组内存交换)
def question_9(list=[1, 4, 6, 9, 45, 56]):
n = len(list)
length = 0
if n % 2 == 0:
length = n / 2
else:
length = (n - 1) / 2
for i in range(int(length)):
list[i] = list[n - i - 1] + list[i]
list[n - i - 1] = list[i] - list[n - i - 1]
list[i] = list[i] - list[n - i - 1]
print(list)
把我之前在面试的时候讲的问题,扩展了一下,整体难度一般,但还算不上送分题.
要点在于,判断数组的长度,因为存储的是数值,在进行长度判断之后,我们只需要加减就行了.
第十题
# 10. 看着盘子里的食物,我突然感觉少了点什么,于是我打开冰箱取出来食物23号,并按照原来的顺序(逆序)将它放在了合适的位置(list,插入)
def question_10(list=[1, 4, 6, 9, 45, 56], number=23):
if number > list[len(list) - 1]:
list.append(number)
else:
for i in range(len(list)):
if list[i] > number:
list.insert(i, number)
break
# print(i)
print(list)
question_1()
这个问题就是进行插入,但是到时存在一个很严重的问题,插入位置错了,或者……自己看了看大小去直接插入(这种方式…..哎,算了无力吐槽.只能说,最起码完成该问题的目标了,只是该让计算机去做的事情,你去做了,很可惜.不是最好的解决方案),我给出的一般都是通用解决方案.这个都一个星期了,要是还是总是替计算机做部分工作的话,那我也不太好说,到底是偷懒,还是投机取巧了……
统一执行
# 11.刚刚拿起食物一号,我的手机突然响了,原来是她,来电话了......恩,所以现在我要去接电话了.
def exec_all_function(n=10):
for i in range(n):
if i + 1 == 4:
continue
exec("question_" + str(i + 1) + "()")
最后的话
关于函数式编程以及python语言自身的巧妙,还是希望各位,去自行体会吧.但是最起码把自己该做的做了.