自学Python的一些笔记(入门)

入门

zip()函数可以把两个 list 变成一个 list:

 zip([10, 20, 30], ['A', 'B', 'C'])
[(10, 'A'), (20, 'B'), (30, 'C')]

在迭代 [‘Adam’, ‘Lisa’, ‘Bart’, ‘Paul’] 时,如果我们想打印出名次 - 名字(名次从1开始),请考虑如何在迭代中打印出来。

提示:考虑使用zip()函数和range()函数

L = ['Adam', 'Lisa', 'Bart', 'Paul']
for index, name in zip(range(1, len(L)+1), L):
    print index, '-', name

函数式编程

闭包

返回闭包不能引用循环变量,请改写count()函数,让它正确返回能计算1x1、2x2、3x3的函数。

def count():
    fs = []
    for i in range(1, 4):
        def f(j):
            def g():
                return j*j
            return g
        r = f(i)
        fs.append(r)
    return fs
f1, f2, f3 = count()
print f1(), f2(), f3()

decorator装饰器

编写无参数decorator

请编写一个@performance,它可以打印出函数调用的时间。

计算函数调用的时间可以记录调用前后的当前时间戳,然后计算两个时间戳的差。

import time
def performance(f):
    def fn(*args, **kw):
        t1 = time.time()
        r = f(*args, **kw)
        t2 = time.time()
        print 'call %s() in %fs' % (f.__name__, (t2 - t1))
        return r
    return fn
 
@performance
def factorial(n):
    return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10)

编写带参数decorator

上一节的@performance只能打印秒,请给 @performace 增加一个参数,允许传入’s’或’ms’:

要实现带参数的@performance,就需要实现:

my_func = performance(‘ms’)(my_func)

需要3层嵌套的decorator来实现。

import time
def performance(unit):
    def perf_decorator(f):
        def wrapper(*args, **kw):
            t1 = time.time()
            r = f(*args, **kw)
            t2 = time.time()
            t = (t2 - t1) * 1000 if unit=='ms' else (t2 - t1)
            print 'call %s() in %f %s' % (f.__name__, t, unit)
            return r
        return wrapper
    return perf_decorator
 
@performance('ms')
def factorial(n):
    return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10)

完善decorator

请思考带参数的@decorator,@functools.wraps应该放置在哪:

import time, functools
def performance(unit):
    def perf_decorator(f):
        @functools.wraps(f)
        def wrapper(*args, **kw):
            t1 = time.time()
            r = f(*args, **kw)
            t2 = time.time()
            t = (t2 - t1) * 1000 if unit=='ms' else (t2 - t1)
            print 'call %s() in %f %s' % (f.__name__, t, unit)
            return r
        return wrapper
    return perf_decorator
 
@performance('ms')
def factorial(n):
    return reduce(lambda x,y: x*y, range(1, n+1))
print factorial.__name__

面向对象编程基础

创建实例属性

请创建包含两个 Person 类的实例的 list,并给两个实例的 name 赋值,然后按照 name 进行排序。

class Person(object):
    pass
 
p1 = Person()
p1.name = 'Bart'
 
p2 = Person()
p2.name = 'Adam'
 
p3 = Person()
p3.name = 'Lisa'
 
L1 = [p1, p2, p3]
L2 = sorted(L1, key = lambda x: x.name)
 
print L2[0].name
print L2[1].name
print L2[2].name

初始化实例属性

请定义Person类的__init__方法,除了接受 name、gender 和 birth 外,还可接受任意关键字参数,并把他们都作为属性赋值给实例。

要定义关键字参数,使用 **kw;

除了可以直接使用self.name = 'xxx’设置一个属性外,还可以通过 setattr(self, ‘name’, ‘xxx’) 设置属性。

class Person(object):
    def __init__(self, name, gender, birth, **kw):
        self.name = name
        self.gender = gender
        self.birth = birth
        for k, v in kw.iteritems():
            setattr(self, k, v)
xiaoming = Person('Xiao Ming', 'Male', '1990-1-1', job='Student')
print xiaoming.name
print xiaoming.job

类的继承

多态

Python提供了open()函数来打开一个磁盘文件,并返回 File 对象。File对象有一个read()方法可以读取文件内容:

例如,从文件读取内容并解析为JSON结果:

import json
f = open(’/path/to/file.json’, ‘r’)
print json.load(f)

由于Python的动态特性,json.load()并不一定要从一个File对象读取内容。任何对象,只要有read()方法,就称为File-like Object,都可以传给json.load()。

请尝试编写一个File-like Object,把一个字符串 r’[“Tim”, “Bob”, “Alice”]'包装成 File-like Object 并由 json.load() 解析。

只要为Students类加上 read()方法,就变成了一个File-like Object。

import json
 
class Students(object):
    def read(self):
        return r'["Tim", "Bob", "Alice"]'
 
s = Students()
 
print json.load(s)

获取对象信息

对于Person类的定义:

class Person(object):
def init(self, name, gender):
self.name = name
self.gender = gender

希望除了 name和gender 外,可以提供任意额外的关键字参数,并绑定到实例,请修改 Person 的 init()定 义,完成该功能。

传入**kw 即可传入任意数量的参数,并通过 setattr() 绑定属性。

class Person(object):
    def __init__(self, name, gender, **kw):
        self.name = name
        self.gender = gender
        for k, v in kw.iteritems():
            setattr(self, k, v)
 
p = Person('Bob', 'Male', age=18, course='Python')
print p.age
print p.course

定制类

len

斐波那契数列是由 0, 1, 1, 2, 3, 5, 8…构成。

请编写一个Fib类,Fib(10)表示数列的前10个元素,print Fib(10) 可以打印出数列的前 10 个元素,len(Fib(10))可以正确返回数列的个数10。

class Fib(object):
    def __init__(self, num):
        a, b, L = 0, 1, []
        for n in range(num):
            L.append(a)
            a, b = b, a + b
        self.numbers = L
 
    def __str__(self):
        return str(self.numbers)
 
    __repr__ = __str__
 
    def __len__(self):
        return len(self.numbers)
 
f = Fib(10)
print f
print len(f)

数学运算

Rational类虽然可以做加法,但无法做减法、乘方和除法,请继续完善Rational类,实现四则运算。

提示:
减法运算:sub
乘法运算:mul
除法运算:div

def gcd(a, b):
    if b == 0:
        return a
    return gcd(b, a % b)
 
class Rational(object):
    def __init__(self, p, q):
        self.p = p
        self.q = q
    def __add__(self, r):
        return Rational(self.p * r.q + self.q * r.p, self.q * r.q)
    def __sub__(self, r):
        return Rational(self.p * r.q - self.q * r.p, self.q * r.q)
    def __mul__(self, r):
        return Rational(self.p * r.p, self.q * r.q)
    def __div__(self, r):
        return Rational(self.p * r.q, self.q * r.p)
    def __str__(self):
        g = gcd(self.p, self.q)
        return '%s/%s' % (self.p / g, self.q / g)
    __repr__ = __str__
 
r1 = Rational(1, 2)
r2 = Rational(1, 4)
print r1 + r2
print r1 - r2
print r1 * r2
print r1 / r2
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值