python学习代码实践记录

# 过滤偶数

def is_odd(n):
    return n % 2 == 1
L = list(filter(is_odd, [1, 2, 3, 4, 5]))
print(L)

# 用filter求素数

def _odd_iter():
    n = 1
    while True:
        n = n + 2
        yield n

def _not_divisible(n):
    return lambda x: x % n >0

def primes():
    yield 2
    it = _odd_iter() # 初始序列
    while True:
        n = next(it) # 返回序列的第一个对象
        yield n
        it = filter(_not_divisible(n), it) # 构造新序列

for n in primes():
    if n < 1000:
        print(n)
    else:
        break

# 写一个hello的模块

import sys

def test():
    args = sys.argv
    if len(args) == 1:
        print('hello world')
    elif len(args) == 2:
        print('Hello, %s' % args[1])
    else:
        print('Too many arguments!')

if __name__ == '__main__':
    test()

# 以_或__开头的函数默认内部使用

def _private_1():
    return 'Hello, %s' % name

def _private_2():
    return 'Hi, %s' % name

def greeting(name):
    if len(name) > 3:
        return _private_1(name)
    else:
        return _private_2(name)

print(greeting('Michael'))

# 缩略图生成

from PIL import Image

def thumbnail_generator(mdic):
    im = Image.open(mdic)
    size = 128, 128 #定义一个元组
    print(im.format, im.size, im.mode) #png (540, 258) P
    if im.mode != 'RGB':
        im = im.convert('RGB') #mode!='RGB'时要转化为RGB,否则生成JPG缩略图报错
    im.thumbnail(size)
    im.save('thumb.jpg', 'JPEG')

thumbnail_generator('test.jpg')

# 函数实现

std1 = {'name': 'Michael', 'score': 98}
std2 = {'name': 'Bob', 'score': 81}

def print_score(std):
    print('%s: %s' %(std['name'], std['score']))

print_score(std2)

# 面向对象实现

class Student(object):
    def __init__(self, name, score):
        self.name = name
        self.__score = score # __表示类私有的

    def print_score(self):
        print('%s: %s' %(self.name, self.score))

bart = Student('Bart Simpson', 59)
lisa = Student('Lisa Simpson', 87)

bart.print_score()
lisa.print_score()

# 类的继承和多态

class Animal(object):
    def run(self):
        print('Animal is running...')

class Dog(Animal):
    def run(self):
        print('Dog is running..')

class Cat(Animal):
    def run(self):
        print('Cat is running..')

dog = Dog()
dog.run()

cat = Cat()
cat.run()

# 从文件流中读取图像

def readImg(fp):
    if(hasattr()):
        print(readData(fp))
    print(None)

readImg('test.jpg')

# 使用get和set

class Student(object):
    def get_score(self):
        return self._score

    def set_score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self._score = value

s = Student()
s.set_score(60)
print(s.get_score())
s.set_score(9999) # 报错

# 多重继承

class Animal(object):
    pass

# 大类
class Mammal(Animal):
    pass

class Bird(Animal):
    pass

# 各种动物
class Dog(Mammal):
    pass

class Bat(Mammal):
    pass

class Parrot(Bird):
    pass

class Ostrish(Bird):
    pass

# 再加上Runnable和Flyable功能
class Runnable(object):
    def run(self):
        print('Running...')

class Flyable(self):
    def fly(self):
        print('Flying...')

# 对于需要Runnable功能的
class Bat(Mammal, Runnable):
    pass

# 使用错误码来表示是否出错, 其实十分不便

def foo():
    r = some_function()
    if r == (-1):
        return (-1)
    # do something
    return r

def bar():
    r = foo()
    if r = (-1):
        print('Error')
    else:
        pass

# try...except...finally...错误处理机制

try:
    print('try...')
    r = 10 / 0
    print('result:', r)
except ZeroDivisionError as e:
    print('except:', e)
finally:
    print('finally...')
print('END')

# 多个except来捕获不同类型的错误

try:
    print('try...')
    r = 10 / int('a')
    print('result:', r)
except ValueError as e:
    print('ValueError:', e)
except ZeroDivisionError as e:
    print('ZeroDivisionError', e)
finally:
    print('finally...')
print('END')

# 调用堆栈, 错误一直往上抛

def foo(s):
    return 10 / int(s)

def bar(s):
    return foo(s) * 2

def main():
    bar('0')

main()

# 执行错误抛出后,继续运行

class FooEffor(ValueError):
    pass

def foo(s):
    n = int(s)
    if n==0:
        raise FooError('invalid value:%s' % s)
    return 10 /n

foo('0')

# 1. 简单直接粗暴, 把可能有问题的变量打印出来
def foo(s):
    n = int(s)
    print('>>> n = %d' %n)
    print 10 / n

def main():
    foo('0')

main()

# 2.凡是print()来辅助查看的地方, 都可以用断言(assert)来替代s
def foo(s):
    assert n != 0, 'n is zero'
    return 10 / n
def main():
    foo('0')

main()

# 3.logging不会抛出错误,而且可以输出到文件
import logging
logging.basicConfig(level=logging.INFO)

s = '0'
n = int(s)
logging.info('n = %d' % n)
print(10 / n)

# 编写单元测试

import unittest

from mydict import Dict

class TestDict(unittest.TestCase):

    def setUp(self):
        print('setUp...')

    def tearDown(self):
        print('tearDown...')

    def test_init(self):
        self.assertEqual(a=1, b='test')
        self.assertEqual(d.a, 1)
        self.assertEqual(d.b, 'test')
        self.assertTrue(isinstance(d, dict))

    def test_key(self):
        d = Dict()
        d['key'] = 'value'
        self.assertEqual(d.key, 'value')

    def test_attr(self):
        d = Dict()
        d['key'] = 'value'
        self.assertTrue('key' in d)
        self.assertEqual(d['key'], 'value')

    def test_keyerror(self):
        d = Dict()
        with self.assertRaises(KeyError):
            value = d['empty']

    def test_attrerror(self):
        d = Dict()
        with self.assertRaises(AttributeError):
            value = d.empty

if __name__ == '__main__':
    unittest.main()

# 访问数据库

SQLlite

# mysql
# 导入mysql驱动
import mysql.connector
# 注意把password设为你的root口令
conn = mysql.connector.connect(user='root', password='123456', database='test')
cursor = conn.cursor()
# 创建user表
cursor.excute('create table user (id varchar(20) primary key, name varchar(20))')
# 插入一行记录, 记住mysql的占位符是%s
cursor.excute('insert into user(id, name) value(%s, %s)', ['1', 'lei.sun'])
cursor.rowcount
# 提交事务
conn.commit()
cursor.close()
# 运行查询
cursor = conn.cursor()
cursor.excute('select * from user where id = %s', ('1', ))
values = cursor.fetchall()
values

# 参考资料