发布于2019-07-30 10:58 阅读(5035) 评论(0) 点赞(1) 收藏(2)
示例:
a = 1 def fun(a): a = 2 fun(a) print a # 1
a = [] def fun(a): a.append(1) fun(a) print a # [1]
def foo(x): print "executing foo(%s)"%(x) class A(object): def foo(self,x): print "executing foo(%s,%s)"%(self,x) @classmethod def class_foo(cls,x): print "executing class_foo(%s,%s)"%(cls,x) @staticmethod def static_foo(x): print "executing static_foo(%s)"%x a=A()
这个self和cls是对类或者实例的绑定,对于一般的函数来说我们可以这么调用foo(x)
,这个函数就是最常用的,它的工作跟任何东西(类,实例)无关.对于实例方法,我们知道在类里每次定义方法的时候都需要绑定这个实例,就是foo(self, x)
,为什么要这么做呢?因为实例方法的调用离不开实例,我们需要把实例自己传给函数,调用的时候是这样的a.foo(x)
(其实是foo(a, x)
).类方法一样,只不过它传递的是类而不是实例,A.class_foo(x)
.注意这里的self和cls可以替换别的参数,但是python的约定是这俩,还是不要改的好.
对于静态方法其实和普通的方法一样,不需要对谁进行绑定,唯一的区别是调用的时候需要使用a.static_foo(x)
或者A.static_foo(x)
来调用.
class Person: name=[] p1=Person() p2=Person() p1.name.append(1) print p1.name # [1] print p2.name # [1] print Person.name # [1]
class Test(object): num_of_instance = 0 def __init__(self, name): self.name = name Test.num_of_instance += 1 if __name__ == '__main__': print Test.num_of_instance t1 = Test('jack') print Test.num_of_instance t2 = Test('lucy') print t1.name , t1.num_of_instance print t2.name , t2.num_of_instance
访问对象属性:
>>> li=[i*2 for i in range(10) if i % 2 == 0] >>> print (li) [0, 4, 8, 12, 16] >>>
>>> mca={"a":1, "b":2, "c":3, "d":4} >>> dicts={v:k for k,v in mca.items()} >>> print (dicts) {1: 'a', 2: 'b', 3: 'c', 4: 'd'} >>>
>>> squared={i*2 for i in [1,1,2]} >>> print (squared) set([2, 4]) >>>
_foo
:
__foo
:
_classname__foo
来代替这个名字,以区别和其他类相同的命名.__foo__
:
>>> class MyClass(): ... def __init__(self): ... self.__superprivate = "Hello" ... self._semiprivate = ", world!" ... >>> mc = MyClass() >>> print mc.__superprivate Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: myClass instance has no attribute '__superprivate' >>> print mc._semiprivate , world! >>> print mc.__dict__ {'_MyClass__superprivate': 'Hello', '_semiprivate': ', world!'}
对于%
最烦人的是它无法同时传递一个变量和元组.
name = (1,2,3) print ("hi there %s" % name) # 报错 print ("hi there %s" % (name,)) # 提供一个单元素的数组而不是一个参数
.format通过{}和.来代替%
print ("{0},{1}".format('lujf',123))
print ("{name},{age}".format(name='lujf',age=23))
class Person: def __init__(self,name,age): self.name,self.age = name,age def __str__(self): return 'This guy is {self.name},is {self.age} old'.format(self=self)
p = ['lujf',23] print ('{0[0]},{0[1]}'.format(p))
迭代器:
迭代器更大的功劳是提供了一个统一的访问集合的接口,只要定义了__iter__()方法对象,就可以使用迭代器访问。
迭代器有两个基本的方法
class Fab(object): def __init__(self, max): self.max = max self.n, self.a, self.b = 0, 0, 1 def __iter__(self): return self def next(self): if self.n < self.max: r = self.b self.a, self.b = self.b, self.a + self.b self.n = self.n + 1 return r raise StopIteration() #python处理迭代器越界是抛出StopIteration异常
使用迭代器:
>>> lst = range(5) >>> it = iter(lst) >>> it <listiterator object at 0x01A63110>
>>> it.next() 0 >>> it.next() 1 >>> it.next() 2
事实上,因为迭代器如此普遍,python专门为for关键字做了迭代器的语法糖。在for循环中,Python将自动调用工厂函数iter()获得迭代器,自动调用next()获取元素,还完成了检查StopIteration异常的工作。
生成器:
def fab(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1
简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。
在一个生成器中,如果没有return,则默认执行到函数完毕;如果遇到return,如果在执行过程中 return,则直接抛出 StopIteration 终止迭代。
如果我们不确定往一个函数中传入多少参数,或者我们希望以元组(tuple)或者列表(list)的形式传参数的时候,我们可以使用*args 。当函数的参数前面有一个星号*号的时候表示这是一个可变的位置参数。星号*把序列或者集合解包(unpack)成位置参数。
def print_everything(*args): for count, thing in enumerate(args): #enumerate()为python内置函数 print('{},{}'.format(count, thing)) print_everything('apple', 'banana', 'cabbage') #输出 #0,apple #1,banana #2,cabbage
如果我们不知道往函数中传递多少个关键词参数或者想传入字典的值作为关键词参数的时候我们可以使用**kwargs。两个星号**把字典解包成关键词参数。
def table_things(**kwargs): for name, value in kwargs.items(): #Python 字典(Dictionary) items()方法 print ('{} = {}'.format(name, value)) table_things(apple = 'fruit', cabbage = 'vegetable') #输出 #apple = fruit #cabbage = vegetable
# -*- coding: utf-8 -*- import time def foo(): print 'in foo()' # 定义一个计时器,传入一个,并返回另一个附加了计时功能的方法 def timeit(func): # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装 def wrapper(): start = time.clock() func() end = time.clock() print ('used:', end - start) # 将包装后的函数返回 return wrapper foo = timeit(foo) foo()
在在这个例子中,函数进入和退出时需要计 时,这被称为一个横切面(Aspect),这种编程方式被称为面向切面的编程(Aspect-Oriented Programming)。
函数重载主要是为了解决两个问题:
示例:
def f(a,L=[]): L.append(a) print L
f(1) #[1]
f(2) #[1,2]
缺省参数在python中是与函数绑定在一起的。
也就是说,一个函数中定义了一个缺省参数,那么这个参数会随着被调用而改变。(一个坑)
在一次调用中改变了缺省参数的值,可能会影响到这个函数的另外一次调用。
lass Book(object): def __new__(cls, title): print'__new__' return super(Book, cls).__new__(cls) def __init__(self, title): print'__init__' super(Book, self).__init__(self) self.title = title b = Book('The Django Book') print(b.title)
官方文档:
也就是,__new__在__init__之前被调用,__new__的返回值(实例)将传递给__init__方法的第一个参数,然后__init__给这个实例设置一些参数。
简单点说协程是进程和线程的升级版,进程和线程都面临着内核态和用户态的切换问题而耗费许多切换时间,而协程就是用户自己控制切换的时机,不再需要陷入系统的内核态.
map( lambda x: x*x, [y for y in range(10)] )
def sq(x): return x * x map(sq, [y for y in range(10)])
Python中对象之间的赋值是按引用传递的,如果要拷贝对象需要使用标准模板中的copy
import copy a = [1, 2, 3, 4, ['a', 'b']] #原始对象 b = a #赋值,传对象的引用 c = copy.copy(a) #对象拷贝,浅拷贝 d = copy.deepcopy(a) #对象拷贝,深拷贝 a.append(5) #修改对象a a[4].append('c') #修改对象a中的['a', 'b']数组对象 print ('a = ', a) print ('b = ', b) print ('c = ', c) print ('d = ', d) 输出结果: a = [1, 2, 3, 4, ['a', 'b', 'c'], 5] b = [1, 2, 3, 4, ['a', 'b', 'c'], 5] c = [1, 2, 3, 4, ['a', 'b', 'c']] d = [1, 2, 3, 4, ['a', 'b']]
注意: 浅拷贝和深拷贝的不同仅仅是对组合对象来说,所谓的组合对象就是包含了其它对象的对象,如列表,类实例。而对于数字、字符串以及其它“原子”类型,没有拷贝一说,产生的都是原对象的引用。
python中的对象包含三要素:id、type、value
其中 id 用来唯一标识一个对象。
f = open('poem.txt','r') a = f.read() print (a)
f = open('poem.txt','r') result = list() for line in open('poem.txt'): line = f.readline() print (line) result.append(line) print (result) f.close()
f = open('poem.txt', 'r') #以读方式打开文件 result = list() for line in f.readlines(): #依次读取每行 line = line.strip() #去掉每行头尾空白 if not len(line) or line.startswith('#'): #判断是否是空行或注释行 continue #是的话,跳过不处理 result.append(line) #保存 result.sort() #排序结果 print result
Python中的垃圾回收是以引用计数为主,标记-清除和分代收集为辅。
os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口。
sys模块负责程序与Python解释器的交互,提供了一系列的函数和变量用户操作Python运行时的环境。
简单来说,lambda表达式通常是当你需要使用一个函数,但是又不想费脑袋去命名一个函数的时候使用,也就是通常所说的匿名函数。
#示例 f = lambda x,y,z: x + y + z print(f(1,2,3)) L = {'f1':(lambda x,y: x**2 + y**2), 'f2':(lambda x,y: x**3 + y**3), 'f3':(lambda x,y: x**4 + y**3)} print(L['f2'](3,2))
作者:lg
链接:https://www.pythonheidong.com/blog/article/2467/cb20d18e52f8a2bcb446/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!