python函数参数类实例的简单介绍

python 类当函数如何实例化可以把类当做参数传入到函数里,在函数里进行实例化 。如下所示 。
把类A当做参数传入get_instance_from_class 。在get_instance_from_class中对A进行实例化,获得其实例,并返回 。
class A:
def __init__(self):
print "I am a A instance."
def print_myself(self):
print "print myself."
def main():
def get_instance_from_class(a):
return a()
a = get_instance_from_class(A)
a.print_myself()
if __name__=="__main__":
main()
python-函数可变参数类型python中python函数参数类实例的函数python函数参数类实例,大多需要配置参数,以下是几种函数的参数类型python函数参数类实例:
1.必备参数python函数参数类实例:以正确的顺序、个数传入函数 。调用时的参数情况要和声明时一样 。最常用的情况 。
def tplink(a,b):
c=a b b
return c
tplink(4,2)
2.关键字参数:使用关键字参数允许函数调用时参数的顺序和声明时不一致,因为python解析器会在调用函数时,用参数名匹配参数值 。
def tplink(age1,age2):
ageall=age1 age2 age2
return ageall
tplink(age2=4,age1=2)
3.默认参数:默认某个参数的取值
def tplink(age1,age2=5):
ageall=age1 age2 age2
return ageall
tplink(age1=4)
4.不定长参数:在声明时并不确定 调用时的参数数量 。这种情况,可以用不定长参数进行解决,具体操作是在参数名前用* 。
但不能和 关键字参数并用 。一般在正常参数arg之后 。
*args、**kwargs的定义:
这两个都是python中的不定长参数 , 又称为可变参数 。
*args 表示任何多个无名参数 , 它是一个 tuple python函数参数类实例;
**kwargs 表示关键字参数,它是一个dict 。
同时使用 * args和 ** kwargs 时,必须 * args参数列要在 ** kwargs前 。且都在arg之后 。
函数在调用时,会根据顺序,看是否放进 *args 或者 **kwargs中 。
具体可根据实际情况使用,可以 更方便灵活的接收信息 。
python 函数参数的类型1. 不同类型的参数简述
#这里先说明python函数调用得语法为:
复制代码
代码如下:
func(positional_args,
keyword_args,
*tuple_grp_nonkw_args,
**dict_grp_kw_args)
#为了方便说明,之后用以下函数进行举例
def test(a,b,c,d,e):
print a,b,c,d,e
举个例子来说明这4种调用方式得区别:
复制代码
代码如下:
#
#positional_args方式
test(1,2,3,4,5)
1 2 3 4 5
#这种调用方式的函数处理等价于
a,b,c,d,e = 1,2,3,4,5
print a,b,c,d,e
#
#keyword_args方式
test(a=1,b=3,c=4,d=2,e=1)
1 3 4 2 1
#这种处理方式得函数处理等价于
a=1
b=3
c=4
d=2
e=1
print a,b,c,d,e
#
#*tuple_grp_nonkw_args方式
x = 1,2,3,4,5
test(*x)
1 2 3 4
5
#这种方式函数处理等价于
复制代码
代码如下:
a,b,c,d,e = x
print
a,b,c,d,e
#特别说明:x也可以为dict类型,x为dick类型时将键传递给函数
y
{'a': 1,
'c': 6, 'b': 2, 'e': 1, 'd': 1}
test(*y)
a c b e d
#
#**dict_grp_kw_args方式
y
{'a': 1, 'c': 6, 'b': 2, 'e': 1, 'd': 1}
test(**y)
1 2 6
1 1
#这种函数处理方式等价于
a = y['a']
b = y['b']
... #c,d,e不再赘述
print
a,b,c,d,e
2.
不同类型参数混用需要注意的一些细节
接下来说明不同参数类型混用的情况,要理解不同参数混用得语法需要理解以下几方面内容.
首先要明白,函数调用使用参数类型必须严格按照顺序,不能随意调换顺序,否则会报错. 如 (a=1,2,3,4,5)会引发错误,;
(*x,2,3)也会被当成非法.
其次,函数对不同方式处理的顺序也是按照上述的类型顺序.因为#keyword_args方式和**dict_grp_kw_args方式对参数一一指定,所以无所谓顺序.所以只需要考虑顺序赋值(positional_args)和列表赋值(*tuple_grp_nonkw_args)的顺序.因此,可以简单理解为只有#positional_args方式,#*tuple_grp_nonkw_args方式有逻辑先后顺序的.
最后,参数是不允许多次赋值的.
举个例子说明,顺序赋值(positional_args)和列表赋值(*tuple_grp_nonkw_args)的逻辑先后关系:
复制代码
代码如下:
#只有在顺序赋值,列表赋值在结果上存在罗辑先后关系
#正确的例子1
x =
{3,4,5}
test(1,2,*x)
1 2 3 4 5
#正确的例子2
test(1,e=2,*x)
1 3 4 5 2
#错误的例子
test(1,b=2,*x)
Traceback (most recent call
last):
File "stdin", line 1, in module
TypeError: test()
got multiple values for keyword argument 'b'
#正确的例子1,处理等价于
a,b = 1,2 #顺序参数
c,d,e = x #列表参数
print a,b,c,d,e
#正确的例子2,处理等价于
a = 1 #顺序参数
e = 2 #关键字参数
b,c,d = x #列表参数
#错误的例子,处理等价于
a = 1 #顺序参数
b = 2 #关键字参数
b,c,d = x
#列表参数
#这里由于b多次赋值导致异常,可见只有顺序参数和列表参数存在罗辑先后关系
函数声明区别
理解了函数调用中不同类型参数得区别之后,再来理解函数声明中不同参数得区别就简单很多了.
1. 函数声明中的参数类型说明
函数声明只有3种类型, arg, *arg , **arg 他们得作用和函数调用刚好相反.
调用时*tuple_grp_nonkw_args将列表转换为顺序参数,而声明中的*arg的作用是将顺序赋值(positional_args)转换为列表.
调用时**dict_grp_kw_args将字典转换为关键字参数,而声明中**arg则反过来将关键字参数(keyword_args)转换为字典.
特别提醒:*arg
和 **arg可以为空值.
以下举例说明上述规则:
复制代码
代码如下:
#arg, *arg和**arg作用举例
def
test2(a,*b,**c):
print a,b,c
#
#*arg 和
**arg可以不传递参数
test2(1)
1 () {}
#arg必须传递参数
test2()
Traceback (most recent call last):
File "stdin", line 1,
in module
TypeError: test2() takes at least 1 argument (0 given)
#
#*arg将顺positional_args转换为列表
test2(1,2,[1,2],{'a':1,'b':2})
1 (2, [1, 2], {'a': 1, 'b': 2})
{}
#该处理等价于
a = 1 #arg参数处理
b = 2,[1,2],{'a':1,'b':2} #*arg参数处理
c =
dict() #**arg参数处理
print a,b,c
#
#**arg将keyword_args转换为字典
test2(1,2,3,d={1:2,3:4}, c=12, b=1)
1 (2, 3) {'c': 12, 'b': 1, 'd': {1: 2, 3:
4}}
#该处理等价于
a = 1 #arg参数处理
b= 2,3 #*arg参数处理
#**arg参数处理
c =
dict()
c['d'] = {1:2, 3:4}
c['c'] = 12
c['b'] = 1
print
a,b,c
2. 处理顺序问题
函数总是先处理arg类型参数,再处理*arg和**arg类型的参数.
因为*arg和**arg针对的调用参数类型不同,所以不需要考虑他们得顺序.
复制代码
代码如下:
def test2(a,*b,**c):
print
a,b,c
test2(1, b=[1,2,3], c={1:2, 3:4},a=1)
Traceback (most
recent call last):
File "stdin", line 1, in
module
TypeError: test2() got multiple values for keyword argument
'a'
#这里会报错得原因是,总是先处理arg类型得参数
#该函数调用等价于
#处理arg类型参数:
a = 1
a = 1
#多次赋值,导致异常
#处理其他类型参数
...
print a,b,c
def foo(x,y):
...def bar():
...print
x,y
...return bar
...
#查看func_closure的引用信息
a =
[1,2]
b = foo(a,0)
b.func_closure[0].cell_contents
[1, 2]
b.func_closure[1].cell_contents
b()
[1, 2] 0
#可变对象仍然能被修改
a.append(3)
b.func_closure[0].cell_contents
[1, 2, 3]
b()
[1, 2, 3] 0
Python参数类型 上一期我们学习参数传递怎么传递,也了解了参数的几种类型 。
首先,我们再来回顾一下,形参和实参:
形参是在定义函数时定义的 , 放在函数名后面的圆括号里,可为空
实参是调用函数时为形参传入具体的参数值
简单总结一下,谁调用函数 , 谁就负责传入参数 。
好呐 , 本期我们来详细学习函数几种参数类型 , 大纲如下:
python函数的参数名是无意义的,Python允许在调用函数时通过通过名字来传入参数值 。
位置参数:按照形参位置传入的参数
调用函数时 , 实参默认按位置顺序传递的 。同时实参个数也要和形参匹配
举一个小栗子
如果实参的个数与形参不匹配时 , 调用函数运行就会报错
Python中,形参与调用函数紧密联系在一起的 。
关键字参数:调用函数时,使形参名称来传递参数,形式为“形参名=实参”
关键字参数 , 又叫命名参数,传递时无需考虑参数位置和顺序
举一个小栗子
默认参数:定义函数时,我们可以为形参提前设置具体的值 。
在定义函数时,默认参数要放到位置等其他参数后面
在调用函数时,默认参数是可选的 。如果传入新值,则会覆盖默认值
举一个小栗子
注意,默认值不能位于位置参数前面,否则程序会报错误
不定长参数又名可变参数 。
不定长参数指的是可变数量的参数,分两种情况:
如果不定长参数后面,可以新增参数吗?
我们通过例子来看,会发生什么?
运行上面的程序,Python解释器会报错
原因是,形参a已经是不定长参数,我们调用的test(2,3,4)传入的三个实参,系统自动把它们属于形参a的值,形参b 和形参c就等于没有值传入 , 这时候系统就认为,调用函数的对象,参数没有传够 。
为了解决这一报错,python引入了 强制命名参数
规定,调用不定参数后面有跟位置参数的函数时,传入给位置参数时,必须要强制命名参进行传参 。
逆向参数收集针对的对象传入函数的实参
调用函数时 , 如果实参是元组,列表或者字典,通过在实参前面加入星号,可以自动把元素进行隔开,然后再转入给函数进行处理
举一个小栗子
本期,我们详细学习了参数几种类型 , 为后面我们学习函数 , 打好基础 。
实践是检验真理的过程,大家多动手练习练习,会有不一样的奇妙旅程~
好呐,以上是本期内容,欢迎大佬们评论区指正~
Python的函数参数总结import math
a = abs
print(a(-1))
n1 = 255
print(str(hex(n1)))
def my_abs(x):
# 增加了参数的检查
if not isinstance(x, (int, float)):
raise TypeError('bad operand type')
if x = 0:
return x
else:
return -x
print(my_abs(-3))
def nop():
pass
if n1 = 255:
pass
def move(x, y, step, angle=0):
nx = xstep * math.cos(angle)
ny = y - step * math.sin(angle)
return nx, ny
x, y = move(100, 100, 60, math.pi / 6)
print(x, y)
tup = move(100, 100, 60, math.pi / 6)
print(tup)
print(isinstance(tup, tuple))
def quadratic(a, b, c):
k = b * b - 4 * a * c
# print(k)
# print(math.sqrt(k))
if k0:
print('This is no result!')
return None
elif k == 0:
x1 = -(b / 2 * a)
x2 = x1
return x1, x2
else:
x1 = (-bmath.sqrt(k)) / (2 * a)
x2 = (-b - math.sqrt(k)) / (2 * a)
return x1, x2
print(quadratic(2, 3, 1))
def power(x, n=2):
s = 1
while n0:
n = n - 1
s = s * x
return s
print(power(2))
print(power(2, 3))
def enroll(name, gender, age=8, city='BeiJing'):
print('name:', name)
print('gender:', gender)
print('age:', age)
print('city:', city)
enroll('elder', 'F')
enroll('android', 'B', 9)
enroll('pythone', '6', city='AnShan')
def add_end(L=[]):
L.append('end')
return L
print(add_end())
print(add_end())
print(add_end())
def add_end_none(L=None):
if L is None:
L = []
L.append('END')
return L
print(add_end_none())
print(add_end_none())
print(add_end_none())
def calc(*nums):
sum = 0
for n in nums:
sum = sumn * n
return sum
print(calc(1, 2, 3))
print(calc())
l = [1, 2, 3, 4]
print(calc(*l))
def foo(x, y):
print('x is %s' % x)
print('y is %s' % y)
foo(1, 2)
foo(y=1, x=2)
def person(name, age, **kv):
print('name:', name, 'age:', age, 'other:', kv)
person('Elder', '8')
person('Android', '9', city='BeiJing', Edu='人民大学')
extra = {'city': 'Beijing', 'job': 'Engineer'}
person('Jack', 24, **extra)
def person2(name, age, *, city, job):
print(name, age, city, job)
person2('Pthon', 8, city='BeiJing', job='Android Engineer')
def person3(name, age, *other, city='BeiJing', job='Android Engineer'):
print(name, age, other, city, job)
person3('Php', 18, 'test', 1, 2, 3)
person3('Php2', 28, 'test', 1, 2, 3, city='ShangHai', job='Pyhton Engineer')
def test2(a, b, c=0, *args, key=None, **kw):
print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'key=', key, 'kw =', kw)
test2(1, 2, 3, 'a', 'b', 'c', key='key', other='extra')
args = (1, 2, 3, 4)
kw = {'d': 99, 'x': '#'}
test2(*args, **kw)
【python函数参数类实例的简单介绍】python函数参数类实例的介绍就聊到这里吧 , 感谢你花时间阅读本站内容,更多关于、python函数参数类实例的信息别忘了在本站进行查找喔 。

    推荐阅读