Python编写一些小玩意儿(《Python核心编程》第11章)

本人理科学生狗,本科时抱着自己以后绝不会从事计算机相关工作的态度而对编程敬而远之,大一学习C++也是苦不堪言,类啊,继承啊神马的完全搞不清方向,期末背背书上的代码,勉强及格,大二之后再也没有碰过。研究生鬼使神差地选了计算数学,编程想逃都逃不了,没办法,只能硬着头皮上,先用matlab,相对于C++,我真的觉得matlab比较容易上手,一行命令就能进行复杂的计算。对于我这样一个编程水平连菜鸟都算不上的渣渣来说,matlab让我觉得我还是可以学会一点点编程的。后来进入找实习阶段,想做一些数据分析的工作,师兄建议我学Python,说想做大数据相关的工作,不会一门脚本语言是不行的(当时也不太明白啥是脚本语言),自己也上网查了一些数据分析师要具备的相关技能,提到Python似乎挺多的。于是乎就开始学习吧,宿舍有个哥们儿编程搞得还行,他给我推荐了《Python基础教程》,于是就进入了学习阶段。上Python的官网下载了最新的Python3.4.3,开始了我学习Python的旅程。

第一行代码一定要纪念一下:

print("Hello World!")

接触Python不到三个月,自己看看《Python核心编程》和《Python基础教程》,然后实现一下书上的例子,也练习了核心编程上部分习题,整理了一些我觉得比较有趣的,或者作为和我一样的初学者应该掌握的部分内容,一部分是直接从书上摘录的(我一定注明出处,应该不会侵权吧,好piapia~),一部分是我自己编写的(菜菜鸟水平,大神们勿喷,我一定好好努力变成新手)。所有程序都在Python3.4.3上运行过,没有问题。3.0以上版本应该都是可以运行,2.x版本因语法差异不能直接运行,否则会报错。

1、一个简单的算术游戏,10以内的加减法计算,随机给出整数以及运算符(+或-)组成计算题目作答,如果回答正确,则系统显示正确并提示是否继续;若错误,提示计算出错并且给予两次重新回答的机会,若在两次内答对,则提示是否继续,答错则系统给出正确答案。

#!/usr/bin/env python

from operator import add,sub
from random import randint,choice

ops = {'+':add,'-':sub}
MAXTRIES = 2

def doprob():
    op = choice('+-')
    nums = [randint(1,10) for i in range(2)]
    nums.sort(reverse = True)
    ans = ops[op](*nums)
    pr = '%d %s %d = '%(nums[0],op,nums[1])         
    oops = 0

    while True:
        try:
            if int(input(pr)) == ans:
                print('Correct!')
                break
            if oops == MAXTRIES:
                print('answer \n %s%d'%(pr,ans))
            else:
                print('Incorrect... try again')
                oops +=1
        except (KeyboardInterrupt,EOFError,ValueError):
            print('Invalid input... try again')


def main():
    while True:
        doprob()
        try:
            opt = input('Again? [yes] or [no]?').lower()
            if opt and opt[0] == 'n':
                break
        except (KeyboardInterrupt,EOFError):
            break

if __name__ == '__main__':
    main()

2、用filter( )进行函数式编程。编写一段代码给出一个年份列表并返回一个只有闰年的列表。然后将它转为列表解析。

  • 函数Leapyears( )判断输入的年份是否为闰年
def Leapyears(year):
    if year%4 != 0:
        print(year," no")
    else:
        if year % 100!=0:
            print(year," yes")
        elif year % 100==0 and year %400 !=0:
            print(year," no")
        else:
            print(year,' yes')

# 使用filter()内建函数处理
# 在2.X版本中不用加list,但在3.x版本中,filter()返回的是一个迭代器,
# 需要用list来获取它内部的值(个人理解是这样)
print(list(filter(Leapyears,range(1999,2015))))
  • 转为列表解析
years = [i for i in range(1899,2015) if not i %4]
leapyesrs = [i for i in years if i not in [i for i in years if i%100==0 and i%400!=0]]
print(leapyears)

# 其实可以写在同一行,但是这样表达式太长了,影响可读性,所以就分开写

3、使用reduce( )进行函数式编程及递归。计算N!=N*(N-1)…2*1
(1) 写一个带有参数x,y,并返回其乘积的multi( )函数;
(2) 使用multi( )以及reduce( )计算阶乘
(3) 抛弃multi( ),使用lambda表达式替代

# 这个题其实挺简单的,之所以加进来,是因为在3.x版本中reduce()函数不再像2.x中可以直接使用,
# 而是被添加到了functools模块中,需要导入该模块才行

from functools import reduce
# 第一小题
def multi(x,y):
    return x*y

# 第二小题
print(reduce(multi,range(1,7)))

# 第三小题
print(reduce(lambda x,y:x*y,range(1,7)))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值