python语法备忘(II)

来源:互联网 发布:cydia软件源请求超时 编辑:程序博客网 时间:2024/06/05 18:54

python语法备忘(I)

5.参数传递

(1)形参,实参,传值调用,引用调用

形参:定义函数名和函数体的时候使用的参数,用来接收函数调用时传进来的参数
实参:调用时传递给函数的参数

在调用函数时,实参将赋值给形参。
形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。

传值调用:只使用了实参的值。传值调用机制里,形参是一个局部变量,其初始值为相应实参的值。
引用调用:将实参的地址传递给形参,任何发生在形参上的改变实际上都发生在实参变量上。

(当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。
而如果函数的参数是指针类型变量,在调用该函数的过程中,传给函数的是实参的地址,在函数体内部使用的也是实参的地址,即使用的就是实参本身。所以在函数体内部可以改变实参的值。)

(2)Python参数传递:传值or引用?
都不是。
python中一切皆对象。对象有不可变对象(number,string,tuple等)和可变对象之分(list,dict等)。
Python中函数参数的传递是传递的变量的值,即就是变量所指向的对象的地址
1. 不可变对象作为函数参数,相当于C系语言的值传递
2. 可变对象作为函数参数,相当于C系语言的引用传递

举个例子:

x = 100l = [1,2]def fun(x,l):    x = 2    l.append(3)print x#输出为100,因为数字是不可变对象,所以在函数体中x=2,把局部变量x指向2,而外部的x依旧指向100print l#输出为[1,2,3]

(3)参数匹配模式

位置:从左至右匹配
关键字匹配:通过参数名,name=value形式
默认参数:有一个默认值,name=defaultvalue
可变参数:*,将非关键字参数收集起来,以tuple的形式保存
可变参数解包:**,将非关键字参数收集起来,以dict的形式保存
这里写图片描述

混合使用是匹配的顺序为:

1.位置
2.关键字参数
3.其他额外的非关键字参数分配到*name元组中
4.其他额外关键字参数分配到**name字典中
5.默认值分配给其他未得到分配的参数

例如

def f(a,b,c=7,*params,**args):    print a,b,c,params,argsf(1,2,3,4,x=1,y=2)#输出1,2,3,(4,),{x=1,y=2}f(1,2,x=1,y=2)#输出1,2,7,(),{x=1,y=2}

6.python模块

差不多有三种形式:

import modulename
from modulename import method
from modulename import *

import如何工作:
(1)找到模块文件
模块搜索路径:
主程序目录
python path 目录
标准库目录
.pth文件目录
打印 sys.path 可以查看
(2)编译成位码
字节码文件 .pyc
会检查文件时间戳,判断是否需要重新编译
(3)执行模块代码
所有语句依次执行

重载模块
reload(模块对象)

模块包
包:Python代码的目录

需要导入指定目录下的模块时,会用到:

import dir1.dir2.modulename
from dir1.dir2 import modulename

注意:包导入语句中的每一个目录下都必须有__init__.py文件
这里写图片描述

Python首次导入某个目录时,会运行该目录下__init__.py文件中的所有代码

7. 类和OOP

新建类的语句:

class A:

类是Python程序的组成单元,就像函数和模块一样,是封装数据和逻辑的一种方式。但python中的类有三个独到之处:
1) 多重实例,每个实例都是一个独立的命名空间。
2)继承
3)运算符重载,定义对象来响应内置类型上的几种运算。

Python中类和实例是两种不同的对象。

属性继承搜索

获取对象的数据和方法都会用到表达式:object.attribute

该表达式在Python中搜索“对象连接树”,寻找attribute首次出现的对象。

搜索规则: 由下至上,由左至右

“对象连接树”:树中位置低的对象继承了位置高的对象拥有的属性。

例如:
类树

I2.w 搜索对象的顺序:I2,C1,C2,C3. 在C3中搜索到首个w即停止搜索。也就是I2继承了C3的w属性。

I2.x 搜索对象的顺序:I2,C1。在C1中找到首个x,虽然C2中也有x,但C1比C2位置更低,先搜索到。

类的方法

定义方法:

class A:    def __init__(self,params):        self.params = parmas    def fun(self,val):        self.val = val

init相当于构造函数,

调用方法:

a = A()
a.fun(5)

当调用类的函数时,会把隐含的实例传进方法中的第一特殊参数self,它相当于this

原创粉丝点击