print(numbers)
foo() # first time, like before, [9]
foo() # second time, not like before, [9, 9]
foo() # third time, not like before too, [9, 9, 9]
# 改进:
def foo(numbers=None):
if numbers is None: numbers = []
numbers.append(9)
print(numbers)
# 另外一个例子 参数的默认值为不可变的:
def foo(count=0): # 这里的0是数字, 是不可变的
count += 1
print(count)
foo() # 输出1
foo() # 还是输出1
foo(3) # 输出4
foo() # 还是输出1
"""函数例子----函数例子----函数例子----函数例子----函数例子----函数例子----函数例子----函数例子----函数例子----函数例子----函数例子----函数例子----函数例子"""
"""数学运算类"""
abs(x) # 求绝对值,参数可以是整型,也可以是复数,若参数是复数,则返回复数的模
complex([real[, imag]]) # 创建一个复数
divmod(a, b) # 分别取商和余数,注意:整型、浮点型都可以
float([x]) # 将一个字符串或数转换为浮点数。如果无参数将返回0.0
int([x[, base]]) # 将一个字符串或浮点数转换为int类型,base表示进制
long([x[, base]]) # 将一个字符串或浮点数转换为long类型
pow(x, y) # 返回x的y次幂
range([start], stop[, step]) # 产生一个序列,默认从0开始
round(x[, n]) # 四舍五入
sum(iterable[, start]) # 对集合求和
oct(x) # 将一个数字转化为8进制字符串
hex(x) # 将一个数字转换为16进制字符串
chr(i) # 返回给定int类型对应的ASCII字符
unichr(i) # 返回给定int类型的unicode
ord(c) # 返回ASCII字符对应的整数
bin(x) # 将整数x转换为二进制字符串
bool([x]) # 将x转换为Boolean类型
"""集合类操作"""
basestring() # str和unicode的超类,不能直接调用,可以用作isinstance判断
format(value [, format_spec]) # 格式化输出字符串,格式化的参数顺序从0开始,如“I am {0},I like {1}”
enumerate(sequence[, start=0]) # 返回一个可枚举的对象,注意它有第二个参数
iter(obj[, sentinel]) # 生成一个对象的迭代器,第二个参数表示分隔符
max(iterable[, args...][key]) # 返回集合中的最大值
min(iterable[, args...][key]) # 返回集合中的最小值
dict([arg]) # 创建数据字典
list([iterable]) # 将一个集合类转换为另外一个集合类
set() # set对象实例化
frozenset([iterable]) # 产生一个不可变的set
tuple([iterable]) # 生成一个tuple类型
str([object]) # 转换为string类型
sorted(iterable[, cmp[, key[, reverse]]]) # 集合排序
L = [('b',2),('a',1),('c',3),('d',4)]
sorted(L, key=lambda x: x[1]), reverse=True) # 使用Key参数和reverse参数
sorted(L, key=lambda x: (x[0], x[1])) # 使用key参数进行多条件排序,即如果x[0]相同,则比较x[1]
"""逻辑判断"""
all(iterable) # 集合中的元素都为真的时候为真,特别的,若为空串返回为True
any(iterable) # 集合中的元素有一个为真的时候为真,特别的,若为空串返回为False
cmp(x, y) # 如果x < y ,返回负数;x == y, 返回0;x > y,返回正数
"""IO操作"""
file(filename [, mode [, bufsize]]) # file类型的构造函数。
input([prompt]) # 获取用户输入,推荐使用raw_input,因为该函数将不会捕获用户的错误输入
raw_input([prompt]) # 设置输入,输入都是作为字符串处理
open(name[, mode[, buffering]]) # 打开文件,与file有什么不同?推荐使用open
"""其他"""
callable(object) # 检查对象object是否可调用
classmethod(func) # 用来说明这个func是个类方法
staticmethod(func) # 用来说明这个func为静态方法
dir([object]) # 不带参数时,返回当前范围内的变量、方法和定义的类型列表;带参数时,返回参数的属性、方法列表。
help(obj) # 返回obj的帮助信息
eval(expression) # 计算表达式expression的值,并返回
exec(str) # 将str作为Python语句执行
execfile(filename) # 用法类似exec(),不同的是execfile的参数filename为文件名,而exec的参数为字符串。
filter(function, iterable) # 构造一个序列,等价于[item for item in iterable if function(item)],function返回值为True或False的函数
list(filter(bool, range(-3, 4)))# 返回[-3, -2, -1, 1, 2, 3], 没有0
hasattr(object, name) # 判断对象object是否包含名为name的特性
getattr(object, name [, defalut]) # 获取一个类的属性
setattr(object, name, value) # 设置属性值
delattr(object, name) # 删除object对象名为name的属性
globals() # 返回一个描述当前全局符号表的字典
hash(object) # 如果对象object为哈希表类型,返回对象object的哈希值
id(object) # 返回对象的唯一标识,一串数字
isinstance(object, classinfo) # 判断object是否是class的实例
isinstance(1, int) # 判断是不是int类型
isinstance(1, (int, float)) # isinstance的第二个参数接受一个元组类型
issubclass(class, classinfo) # 判断class是否为classinfo的子类
locals() # 返回当前的变量列表
map(function, iterable, ...) # 遍历每个元素,执行function操作
list(map(abs, range(-3, 4))) # 返回[3, 2, 1, 0, 1, 2, 3]
next(iterator[, default]) # 类似于iterator.next()
property([fget[, fset[, fdel[, doc]]]]) # 属性访问的包装类,设置后可以通过c.x=value等来访问setter和getter
reduce(function, iterable[, initializer]) # 合并操作,从第一个开始是前两个参数,然后是前两个的结果与第三个合并进行处理,以此类推
def add(x,y):return x + y
reduce(add, range(1, 11)) # 返回55 (注:1+2+3+4+5+6+7+8+9+10 = 55)
reduce(add, range(1, 11), 20) # 返回75
reload(module) # 重新加载模块
repr(object) # 将一个对象变幻为可打印的格式
slice(start, stop[, step]) # 产生分片对象
type(object) # 返回该object的类型
vars([object]) # 返回对象的变量名、变量值得字典
a = Class(); # Class为一个空类
a.name = 'qi', a.age = 9
vars(a) # {'name':'qi', 'age':9}
zip([iterable, ...]) # 返回对应数组
list(zip([1, 2, 3], [4, 5, 6])) # [(1, 4), (2, 5), (3, 6)]
a = [1, 2, 3], b = ["a", "b", "c"]
z = zip(a, b) # 压缩:[(1, "a"), (2, "b"), (3, "c")]
zip(*z) # 解压缩:[(1, 2, 3), ("a", "b", "c")]
unicode(string, encoding, errors) # 将字符串string转化为unicode形式,string为encoded string。
"""模块Moudle----模块Moudle----模块Moudle----模块Moudle----模块Moudle----模块Moudle----模块Moudle----模块Moudle----模块Moudle----模块Moudle----模块Moudle"""
-- Python模块搜索路径:"""
(1)程序的主目录 (2)PYTHONPATH目录 (3)标准链接库目录 (4)任何.pth文件的内容
"""
-- 查看全部的模块搜索路径
import sys
sys.path
-- 模块的使用代码
import module1, module2 # 导入module1 使用module1.printer()
from module1 import printer # 导入module1中的printer变量 使用printer()
from module1 imoprt * # 导入module1中的全部变量 使用不必添加module1前缀
-- 重载模块reload: 这是一个内置函数 而不是一条语句
from imp import reload
reload(module)
-- 模块的包导入:使用点号(.)而不是路径(dir1\dir2)进行导入
import dir1.dir2.mod # d导入包(目录)dir1中的包dir2中的mod模块 此时dir1必须在Python可搜索路径中
from dir1.dir2.mod import * # from语法的包导入
-- init.py包文件:每个导入的包中都应该包含这么一个文件
"""
该文件可以为空
首次进行包导入时 该文件会自动执行
高级功能:在该文件中使用__all__列表来定义包(目录)以from*的形式导入时 需要导入什么
"""
-- 包相对导入:使用点号(.) 只能使用from语句
from . import spam # 导入当前目录下的spam模块(错误: 当前目录下的模块, 直接导入即可)
from .spam import name # 导入当前目录下的spam模块的name属性(错误: 当前目录下的模块, 直接导入即可,不用加.)
from .. import spam # 导入当前目录的父目录下的spam模块
-- 包相对导入与普通导入的区别
from string import * # 这里导入的string模块为sys.path路径上的 而不是本目录下的string模块(如果存在也不是)
from .string import * # 这里导入的string模块为本目录下的(不存在则导入失败) 而不是sys.path路径上的
-- 模块数据隐藏:最小化from*的破坏
_X # 变量名前加下划线可以防止from*导入时该变量名被复制出去
__all__ = ['x', 'x1', 'x2'] # 使用__all__列表指定from*时复制出去的变量名(变量名在列表中为字符串形式)
-- 可以使用name进行模块的单元测试:当模块为顶层执行文件时值为'main' 当模块被导入时为模块名
if __name__ == '__main__':
doSomething
# 模块属性中还有其他属性,例如:
__doc__ # 模块的说明文档
__file__ # 模块文件的文件名,包括全路径
__name__ # 主文件或者被导入文件
__package__ # 模块所在的包
-- import语句from语句的as扩展
import modulename as name
from modulename import attrname as name
-- 得到模块属性的几种方法 假设为了得到name属性的值
M.name
M.__dict__['name']
sys.modules['M'].name
getattr(M, 'name')
"""类与面向对象----类与面向对象----类与面向对象----类与面向对象----类与面向对象----类与面向对象----类与面向对象----类与面向对象----类与面向对象----类与面向对象"""
-- 最普通的类class C1(C2, C3):
spam = 42 # 数据属性
def __init__(self, name): # 函数属性:构造函数
self.name = name
def __del__(self): # 函数属性:析构函数
print("goodbey ", self.name)
I1 = C1('bob')
-- Python的类没有基于参数的函数重载
class FirstClass:
def test(self, string):
print(string)
def test(self): # 此时类中只有一个test函数 即后者test(self) 它覆盖掉前者带参数的test函数
print("hello world")
-- 子类扩展超类: 尽量调用超类的方法
class Manager(Person):
def giveRaise(self, percent, bonus = .10):
self.pay = int(self.pay*(1 + percent + bonus)) # 不好的方式 复制粘贴超类代码
Person.giveRaise(self, percent + bonus) # 好的方式 尽量调用超类方法
-- 类内省工具
bob = Person('bob')
bob.__class__ # <class 'Person'>
bob.__class__.__name__ # 'Person'
bob.__dict__ # {'pay':0, 'name':'bob', 'job':'Manager'}
-- 返回1中 数据属性spam是属于类 而不是对象
I1 = C1('bob'); I2 = C2('tom') # 此时I1和I2的spam都为42 但是都是返回的C1的spam属性
C1.spam = 24 # 此时I1和I2的spam都为24
I1.spam = 3 # 此时I1新增自有属性spam 值为2 I2和C1的spam还都为24
-- 类方法调用的两种方式
instance.method(arg...)
class.method(instance, arg...)
-- 抽象超类的实现方法
# (1)某个函数中调用未定义的函数 子类中定义该函数
def delegate(self):
self.action() # 本类中不定义action函数 所以使用delegate函数时就会出错
# (2)定义action函数 但是返回异常
def action(self):
raise NotImplementedError("action must be defined")
# (3)上述的两种方法还都可以定义实例对象 实际上可以利用@装饰器语法生成不能定义的抽象超类
from abc import ABCMeta, abstractmethod
class Super(metaclass = ABCMeta):
@abstractmethod
def action(self): pass
x = Super() # 返回 TypeError: Can't instantiate abstract class Super with abstract methods action
点击查看更多内容
3人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦