本文目录一览:
- 1、python 函数参数 是什么意思
- 2、求教python在文件中写入中文需要的两个参数是做什么的?
- 3、求教python面向对象中 __getattr__方法为什么要两个参数
- 4、python中for循环有两个参数
- 5、python self 为什么是两个参数
python 函数参数 是什么意思
Python 函数定义以及参数传递
1.函数定义
#形如def func(args...):
doSomething123
以关键字def 开头,后面是函数名和参数下面是函数处理过程。
举例:
def add( a, b ):
return a+b12
参数可以设定默认值,如:
def add( a, b=10 ): #注意:默认值参数只会运算一次
return a+b12
默认值参数只会运算一次是什么意思?
def func( a, b=[] ): #b的默认值指向一个空的列表,每次不带默认值都会指向这块内存
b.append(a) return b
print(func(1))#向默认的空列表里加入元素1 ,默认列表里已经是[1]print(func(2))#向默认的列表里加入元素2,默认列表里已经是[1,2]print(func(3,[]))#向b指向的空列表里加入元素1 ,默认列表里还是[1,2]print(func(4))#向默认的列表里加入元素4,默认列表里已经是[1,2,4]'''
结果:
[1]
[1, 2]
[3]
[1, 2, 4]
'''12345678910111213141516
这下明白为什么默认参数只计算一次了吧,函数参数不传递时默认值总是指向固定的内存空间,就是第一次计算的空间。
2.参数传递
def func(a, b):
print('a=%d, b=%d' % (a,b) )12
在使用函数时可以如下方式,结果都是相同的
func(10,20) #不使用参数名,需要按参数顺序传递func(a=10,b=20) #使用参数名可以不按顺序传递func(b=20,a=10)#结果:a=10, b=20a=10, b=20a=10, b=201234567
如果函数定义形式如下方式:
def func(*args): #这种定义会把传递的参数包成元组
print(args,type(args))
func(10,20)#结果:#(10, 20) class 'tuple'1234567
举一个和上述过程相反的例子:
def func(a,b):
print('a=%d, b=%d' % (a,b) )
a = (10, 20)
func(*a) #在调用函数使用`*`则会把元组解包成单个变量按顺序传入函数#结果:a=10, b=20123456
总结:*号在定义函数参数时,传入函数的参数会转换成元组,如果 *号在调用时则会把元组解包成单个元素。
另一种定义:
def func(**kw):#使用**定义参数会把传入参数包装成字典dict
print(kw, type(kw) )
func(a=10,b=20)#这种函数在使用时必须指定参数值,使用key=value这种形式#结果:{'b': 20, 'a': 10} class 'dict'12345
相反的例子:
def func(a,b):
print('a=%d, b=%d' % (a,b) )
d = {'a':10, 'b':20 }
func(**d) #在调用时使用**会把字典解包成变量传入函数。12345
def func(*args, **kw):#这种形式的定义代表可以接受任意类型的参数
print(args,kw )12
总结:**号在定义函数参数时,传入函数的参数会转换成字典,如果 **号在调用时则会把字典解包成单个元素。
lambda表达式
lambda表达式就是一种简单的函数
形如 f = lambda 参数1,参数2: 返回的计算值
例如:
add = lambda x,y: x+y
print(add(1,2))'''
结果:3
'''12345
求教python在文件中写入中文需要的两个参数是做什么的?
encoding是文件编码,默认的一般是ansi,如果不指定的话,打开就有可能看到乱码。
ensure_ascii是json序列化的一个特性,是为了方便传输,避免编码问题(也就是上面的encoding),可用把unicode字符转码为ascii字符,这样就不需要指定encoding了。但是导致的问题就是肉眼看不出中文内容(和乱码有本质区别),ensure_ascii=False的意思就是对中文不做转码处理,原样输出到json
求教python面向对象中 __getattr__方法为什么要两个参数
首先,__getattr__是一个实例方法,既然是实例方法那第一个参数肯定是self,表示实例对象
其次,__getattr__是用来获取属性的,既然是获取属性的那这个方法就得知道当前要获取的属性叫什么名字,也就是第二个参数name
所以,__getattr__需要两个参数。
python中for循环有两个参数
应该这样理解:
dict.items()结果是一个列表,列表的每一个值都是一个包含两个元素的元组,
for遍历的是一个元组对象,k和v是元组里的参数。
所以(k,v)是一个整体,一下结果和你的结果一样的,
for x in d.items():
print "dict[%s]="%x[0],x[1]
其中x就是(k,v),只是要取键值的话你上面的更方便。
祝你成功!
python self 为什么是两个参数
Python中默认参数self的理解
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身,按照惯例它的名称是self。
虽然你可以给这个参数任何名称,但是强烈建议你使用self这个名称——其他名称都是不赞成你使用的。使用一个标准的名称有很多优点——你的程序读者可以迅速识别它,如果使用self的话,还有些IDE(集成开发环境)也可以帮助你。
给C++/Java/C#程序员的注释Python中的self等价于C++中的self指针和Java、C#中的this参考。
你一定很奇怪Python如何给self赋值以及为何你不需要给它赋值。举一个例子会使此变得清晰。假如你有一个类称为MyClass和这个类的一个实例MyObject。当你调用这个对象的方法MyObject.method(arg1, arg2)的时候,这会由Python自动转为MyClass.method(MyObject, arg1, arg2)——这就是self的原理了。
这也意味着如果你有一个不需要参数的方法,你还是得给这个方法定义一个self参数。
声明add()方法时,若不加self,则提示
TypeError: add() takes exactly 2 arguments (3 given)
File "D:\PythonWorkplace\PythonDemo\Tet.py", line 15, in module
test.add(1,3)
错误。
拓展一下:
self在Python里不是关键字。self代表当前对象的地址。self能避免非限定调用造成的全局变量。
self是一种习惯,如上面的程序,把sayHi(self)换成sayHi(fles),同样可以得到正确的输出。