Python的一些基础知识

Python的语言特性

Python的函数参数传递

a = 1
def fun(a):
    a = 2
fun(a)
print a #1

a = []
def fun(a):
    a.append(1)
fun(a)
print a #2

输出结果

1
[1]

所有的变量都可以理解是内存中一个对象的“引用”。
通过id来看引用a的内存地址可以比较理解:

a = 1
def fun(a):
    print "func_in", id(a)
    a = 2
    print "re-point", id(a), id(2)
print "func_out", id(a), id(1)
fun(a)
print a

输出结果为

func_out 12325208 12325208
func_in 12325208
re-point 12325184 12325184
1

在执行a=2之后,a引用中保存的值,即内存地址发生变化,由原来1对象的所在的地址变成了2这个实例对象的内存地址。

类型是属于对象的,而不是变量。
对象有两种:可更改(mutable)与不可更改(immutable)对象。在Python中,string, tuples, numbers是不可更改的对象,而list, dict等则是可以修改的对象。

Python中的元类(metaclass)

@staticmethod和@classmethod

Python有3个方法,即静态方法(staticmethod),类方法(classmethod)和实例方法。

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()
a.foo(1)
a.class_foo(2)
a.static_foo(3)

self cls是对类或者实例的绑定。

类变量和实例变量

class Person:
    name="aaa"

p1=Person()
p2=Person()
p1.name="bbb"
print p1.name  # bbb
print p2.name  # aaa
print Person.name  # aaa

类变量就是提供类使用的变量,实例变量就是提供实例使用的变量。

字典推导式

d = {key: value for (key, value) in iterable }

Python中单下划线和双下划线

foo 一种约定,Python内部的名字,用来去吧区别其他用户自定义的命名,防止冲突;
_foo 一种约定,用来指定变量私有,程序员可以用来指定私有变量
__foo 这个有真正的意义:解析器用_classname__foo来代替这个名字,以区别和其他类相同的命名.

字符串格式化 %和.format

迭代器和生成器

What does the “yield” keyword do in Python?

*args and **kwargs

当不确定函数里将要传递多少参数时可以使用*args


>>> def print_everything(*args):
...     for count, thing in enumerate(args):
...         print '{0}. {1}'.format(count, thing)
... 
>>> print_everything('apple', 'banana', 'cabbage')
0. apple
1. banana
2. cabbage

**kwargs允许使用没有事先定义的参数名。

>>> print_everything('apple', 'banana', 'cabbage')
0. apple
1. banana
2. cabbage
>>> def table_things(**kwargs):
...     for name, value in kwargs.items():
...         print '{0} = {1}'.format(name, value)
... 
>>> table_things(apple='fruit', change='vegetable')
apple = fruit
change = vegetable

*arfs **kwargs 可以同时在函数的定义中,但*args 必须在**kwargs前面

面向切面编程AOP和装饰器

面向切面编程AOP

装饰器

装饰器的作用是为已经存在的对象添加额外的功能。
关于对装饰器的理解

Python重载

函数重载主要解决两个问题:
1. 可变参数类型
2. 可变参数个数

newinit的区别

  1. new是一个静态方法,而init是一个实例方法
  2. new方法会返回一个创建的实例,而init什么都不返回
  3. 只有在new返回一个cls的实例时后面的init才能被调用
  4. 当创建一个新实例时低啊用new,初始化一个实例时用init
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值