从零开始学Python(二)-学习笔记

L[0,1]切片 相当于substring
L[-1]倒数第一个 L[-2:-1] 倒着切

取奇数
l = [i for i in range(100) if i % 2 == 1]
取前10位数隔两位一输出
print(l[:10:2])

generator生成器
长度不确定,相比较list知道长度,如果100W个就会比较浪费,generator可以根据next(g)来生成
使用方法:
g = (x * x for x in range(10))
next(g)
可以用list(g)来强行取得生成器的所有结果

map(func,Iterable)
对list内所有值进行方法运算
使用方法:
def f(x):
return x * x
map(f,[1,2,3,4,5])
结果:
[1,4,9,16,25]

reduce(func,Iterable)
两个两个进行方法的运算 得到的结果与下一个计算
使用方法:
def add(x, y):
return x + y
reduce(add,[1,2,3])
结果:
add(add(1,2),3)

filter(func,Iterable)
使用方法:
list(filter(not_empty, [‘A’, ‘’, ‘B’, None, ‘C’, ’ ']))
结果:
[‘A’, ‘B’, ‘C’]
因为返回的是一个惰性序列Iterator,所以要用list强行取得所有结果,not_empty为过滤函数

lambda x: x * x
实际上是
def f(x):
return x * x

L = list(filter(lambda x: x % 2 == 1, range(1, 20)))

lambda在Java中1.8之后经常用

方法中返回方法
def a():
def b(text):
return text * text
return b;

调用t=a()后t就是方法b
再调用t(2)就是执行了b(2)
这里也存在闭包问题

int(‘12345’, 16)可以用来进制转换

可以定义方法
def int2(x, base=2):
return int(x, base)

__init__方法就是JAVA的构造器
__init__方法的第一个参数永远是self,表示创建的实例本身

变量名如果以__开头就变成了一个私有变量(private)

class Animal(object): 表示继承自object类 python的object类小写不太理解

dir(对象) 可以得到所有属性和方法 可能类似反射?
配合getattr()获取属性、setattr()设置属性以及hasattr()有属性
也可以getattr(obj, ‘z’, 404) # 获取属性’z’,如果不存在,返回默认值404

Python的类可以动态绑定属性,比方类里面没声明的属性可以直接赋值也可以获取
class Application(Frame):
def init(self):
pass
c = Application()
c.name = ‘123’
print(c.name)
这种绑定是基于单个对象的
Application.name = ‘123’
print(c.name)
这种绑定是基于类的
如果在创建类时定义__slots__ = (‘name’, ‘age’) # 用tuple定义允许绑定的属性名称
那只能绑定这两种,绑定其他的属性则会报错,slots__仅对当前类有效,继承无效
子类若也定义,那可绑定的属性就是子类的__slots__加父类的__slots

用装饰器可以动态的加功能,python里面使用比较方便,用
@log
def t():
pass
就相当于执行了log(t)

对属性进行某些限制可以用@property装饰器
@property装饰器就是负责把一个方法变成属性调用的
@property本身又创建了另一个装饰器@xxxx.setter负责把一个setter方法变成属性赋值
只定义getter方法,不定义setter方法就是一个只读属性

Python允许使用多重继承,JAVA类是单继承的,接口可以多继承。

def str(self):
return “”
相当于java重写toString(){};

重写__iter__()_,next_()来应用for…in

重写__getitem__来用下标访问某一项
重写__delitem__()来删除某一项

当访问的属性不存在时会调用__getattr__
例如s = Student(‘Michael’)
s()会调用__call__方法
可以用callable(Student())来判断对象是否能调用,也就是有没有定义_call_方法

异常处理
try:
except xxx as e1:
except xxx as e2:
else:
所有错误类型继承自BaseException
raise XXX 可以抛出错误XXX
如果不带参数就抛出当前错误

python打印日志可以导入内置的logging
import logging
logging.basicConfig(level=logging.INFO) #debug,info,warning,error

import logging
再使用
logging.exception(e)
finally:

使用断言assert n != 0, 'n is zero!'来替换print()进行调试
因为启用Python解释器时可以用python -0 a.py来跳过断言

使用Python自带的unittest模块进行单元测试
编写一个测试类,从unittest.TestCase继承
以test开头的方法就是测试方法,不以test开头的方法不被认为是测试方法,测试的时候不会被执行
使用
if name == ‘main’:
unittest.main()
来进行测试
使用下面的方法在单元测试前后调用,例如打开数据库与关闭数据库
def setUp(self):
print(‘setUp…’)

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

f = open(’/test.txt’, ‘r’)
打开test文件,r表示只读
要读取二进制文件,比如图片、视频等等,用’rb’模式
要读取非UTF-8编码的文本文件,需要给open()函数传入encoding参数,例如,读取GBK编码的文件
f = open(’/gbk.txt’, ‘r’, encoding=‘gbk’)
遇到有些编码不规范的文件,你可能会遇到UnicodeDecodeError,因为在文本文件中可能夹杂了一些非法编码的字符。
f = open(’/Users/michael/gbk.txt’, ‘r’, encoding=‘gbk’, errors=‘ignore’)来忽略异常

f.read()输出所有内容到内存 str表示
使用完后f.close()关闭资源
try:
f = open(’/file’, ‘r’)
print(f.read())
finally:
if f:
f.close()
相当于
with open(’/path/to/file’, ‘r’) as f:
print(f.read())
如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便:

with open(’/test.txt’, ‘w’) as f:
f.write(‘Hello, world!’)
用try的方法的话一定要记得close文件,java里的.flush()方法差不多,当然java也要close。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值