python-函数可变参数类型
python中的函数,大多需要配置参数,以下是几种函数的参数类型:
创新互联建站主要从事成都网站制作、成都网站设计、网页设计、企业做网站、公司建网站等业务。立足成都服务阿拉山口,10年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
1.必备参数:以正确的顺序、个数传入函数。调用时的参数情况要和声明时一样。最常用的情况。
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 ;
**kwargs 表示关键字参数,它是一个dict。
同时使用 * args和 ** kwargs 时,必须 * args参数列要在 ** kwargs前。且都在arg之后。
函数在调用时,会根据顺序,看是否放进 *args 或者 **kwargs中。
具体可根据实际情况使用,可以 更方便灵活的接收信息。
python 存储一组不定长序列
list可以是二维的,而且长度可以不一样。
append()函数在list后面追加数据,list本身就不用设置长度,之后追加即可。删除用remove()
[ ]访问特定索引的数据
20201014-python高级函数作业
1、定义一个使用不定长参数的函数,并在函数中打印出参数及其类型,统计传入参数的个数
def test(a,b,*args,c=10,**kwargs):
print("a=",a)
print("b=",b)
print("args=",args)
print("c=",c)
print("kwargs=",kwargs)
print("参数总长度:",1+1+len(args)+1+len(kwargs))
test(1,2,3,4,5,m=4)
def test(a,b,c=10,*args,**kwargs):
print("a=",a)
print("b=",b)
print("args=",args)
print("c=",c)
print("kwargs=",kwargs)
print("参数总长度:",1+1+len(args)+1+len(kwargs))
test(1,2,3,4,5,m=4)
2、定义一个函数max,接受的参数类型是数值,最终返回两个数中的最大值
def max(num1,num2):
if num1num2:
return num1
else:
return num2
3、定义一个函数min,接受的参数类型是数值,最终返回两个数中的最小值
def min(num1,num2):
if num1num2:
return num1
else:
return num2
4、分别定义加减乘除四个函数实现两个数之间的加减乘除操作
# 加法
def add(a,b):
return a+b
# 减法
def sub(a,b):
return a-b
# 乘法
def mul(a,b):
return a*b
# 除法
def div(a,b):
if b==0:
return 0
else:
return a/b
5、分别定义加减乘除四个函数,然后实现多个数之间的累加累减累除累乘操作,如[1,2,3,4,5],累加即是1+2+3+4+5,注意当使用除法时,应判断被除数不能为0
#累加
def add(a,b,*args):
s=a+b
for i in args:
s=s+i
return s
#累减
def sub(a,b,*args):
s=a-b
for i in args:
s=s-i
return s
#累乘
def mul(a,b,*args):
s=a*b
for i in args:
s=s*i
return s
#累除
def div(a,b,*args):
if b==0:
return a
else:
s=a/b
for i in args:
if i ==0:
continue
else:
s=a/b
return s
6、使用不定长参数定义一个函数max_min,接受的参数类型是数值,最终返回这些数中的最大值和最小值——错题
def max_min(*args):
max=0
min=0
if len(args)==0:
return 0,0
elif len(args)==1:
return args[0],args[0]
else:
max=args[0]
min=args[0]
for i in args:
if maxi:
max=i
if mini:
min=i
return max,min
7、定义一个函数,返回n的阶乘的最后结果,并打印出如5阶乘"5!=120”的效果——错题
def f(n):
s=1
for i in range(n):
s=s*(i+1)
print('%s!=%s' %(n,s))
f(5)
8、定义一个函数,返回由n(包含n)以内的奇数或者偶数组成的列表,默认返回全是奇数的列表
def f(n,type='j'):
ls=[]
if type=='j':
for i in range(1,n+1):
if i%2==1:
ls.append(i)
if type=='o':
for i in range(1,n+1):
if i%2==0:
ls.append(i)
return ls
9、定义一个函数,打印出n以内的所有的素数(指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。)——错题
def f(n):
ls=[2]
for i in range(3,n):
for j in range(2,i):
if i%j == 0:
break
else:
ls.append(i)
print(ls)
10、定义一个函数,接受三个参数,分别为字符串s、数值a1、数值a2,将字符串s从下标a1开始的a2个字符删除,并把结果返回,a2默认值为0——错题
def cut_str(s,a1,a2=0):
length = len(s)
if a1+1length or a2 == 0:
return s
else:
s1 = s[:a1]
s2 = s[a1+a2:]
return s1+s2
print(cut_str("hello",6,1))
11、请定义两个函数,一个函数画正方形,一个函数画三角形,并且可以从键盘输入值来决定画正方形还是画三角形以及决定是否退出程序
我的答案:
import turtle
def z():
for i in range(4):
turtle.fd(20)
turtle.right(90)
def s():
for i in range(3):
turtle.fd(20)
turtle.right(120)
m=input('请输入值,z画正方形,s画三角形,其它任意键退出程序:')
if m =='z':
z()
elif m=='s':
s()
else:
print('退出程序')
官方答案:
def square(n):
for i in range(n):
print("*"*n)
def triangle(n):
for i in range(n):
print("*"*(i+1))
12、定义函数findall,实现对字符串find方法的进一步封装,要求返回符合要求的所有位置的起始下标,如字符串"helloworldhellopythonhelloc++hellojava",需要找出里面所有的"hello"的位置,最后将返回一个元组(0,10,21,29),即将h的下标全部返回出来,而find方法只能返回第一个——没懂
def findall(string, s):
ret = []
if s=='':
return ret
while True:
index = string.find(s)
if index != -1:
if len(ret)!=0:
ret.append(ret[-1]+index+len(s))
else:
ret.append(index)
string = string[index+len(s):]
else:
break
return ret
print(findall("abc-abc-abc-","-"))
Python参数类型
上一期我们学习参数传递怎么传递,也了解了参数的几种类型。
首先,我们再来回顾一下,形参和实参:
形参是在定义函数时定义的,放在函数名后面的圆括号里,可为空
实参是调用函数时为形参传入具体的参数值
简单总结一下,谁调用函数,谁就负责传入参数。
好呐,本期我们来详细学习函数几种参数类型,大纲如下:
python函数的参数名是无意义的,Python允许在调用函数时通过通过名字来传入参数值。
位置参数:按照形参位置传入的参数
调用函数时,实参默认按位置顺序传递的。同时实参个数也要和形参匹配
举一个小栗子
如果实参的个数与形参不匹配时,调用函数运行就会报错
Python中,形参与调用函数紧密联系在一起的。
关键字参数:调用函数时,使形参名称来传递参数,形式为“形参名=实参”
关键字参数,又叫命名参数,传递时无需考虑参数位置和顺序
举一个小栗子
默认参数:定义函数时,我们可以为形参提前设置具体的值。
在定义函数时,默认参数要放到位置等其他参数后面
在调用函数时,默认参数是可选的。如果传入新值,则会覆盖默认值
举一个小栗子
注意,默认值不能位于位置参数前面,否则程序会报错误
不定长参数又名可变参数。
不定长参数指的是可变数量的参数,分两种情况:
如果不定长参数后面,可以新增参数吗?
我们通过例子来看,会发生什么?
运行上面的程序,Python解释器会报错
原因是,形参a已经是不定长参数,我们调用的test(2,3,4)传入的三个实参,系统自动把它们属于形参a的值,形参b 和形参c就等于没有值传入,这时候系统就认为,调用函数的对象,参数没有传够。
为了解决这一报错,python引入了 强制命名参数
规定,调用不定参数后面有跟位置参数的函数时,传入给位置参数时,必须要强制命名参进行传参。
逆向参数收集针对的对象传入函数的实参
调用函数时,如果实参是元组,列表或者字典,通过在实参前面加入星号,可以自动把元素进行隔开,然后再转入给函数进行处理
举一个小栗子
本期,我们详细学习了参数几种类型,为后面我们学习函数,打好基础。
实践是检验真理的过程,大家多动手练习练习,会有不一样的奇妙旅程~
好呐,以上是本期内容,欢迎大佬们评论区指正~
Python中不定长参数这样用对吗?def hh(w,**l,pu='d'): 为什么?
题主你好,
一般来说, python函数中有两种形式的参数: 位置参数, 关键字参数.
位置参数: 说白了就是在函数调用时必传的,你不给它赋值函数就运行不了.如:
从拿上图例子来说, 在调用hello时,如果你只写个hello(),肯定会报错, 因为在执行函数里面的print(name)时, 不知道name的值是多少.
所以对于上图来说,hello("Jack"), hello("Mike")这都是正确的调法.
小结: 就上面的hello函数定义来说, name就叫做位置参数. 说白了就是函数定义中,只有变量名的参数就是位置参数(如果这句话不理解,接着向下看完关键字参数,一比较就明白了),而位置参数的特点是: 调用函数时必须要给它们传值,原因上面已经说过 //def hello(a,b,c,d,e,f) 这里面a,b,c,d,e,f全都是位置参数
-----
关键字参数: 首先它同位置参数一样, 也是用在函数定义中. 其外在表现就是一具等式: "变量名=值". 举例来说吧:
对比一下这个hello函数, 和位置参数中的hello函数有啥不一样,可以看到该hello函数中的参数为 name="张三",而位置参数中的hello函数参数为 name, 最大的区别在于函数调用时,
位置参数中你要使用 hello("名字")的形式进行调用, 而关键字参数中直接使用hello()不用加任何参数. 原因也很好理解: 位置参数中name没有默认值, 而关键字参数中,在声明的时候就给name赋了一个默认值,"张三", 所以说在调用关键字参数中的hello函数时,即使我们不给name参数传值,print(name)函数在执行时会使用name的默认值, 整个逻辑是通的.
-----
总结一下位置参数和关键字参数,共两点:
1.从外观看,位置参数就是一个变量名,如a,b,c,d等; 关键字参数表面看就是一个等式,如age=18, name="张三"等.
2.函数调用时,位置参数必须传值;关键字参数可传可不传,传值时用的是传给它的这个值,不传时,用的是在函数声明时的那个默认值. //上面讲关键字参数的时候,函数调用时只说了可以直接使用hello()调用,此时,name使用函数定义时的默认值,"张三". 这里再补一个使用自定义值的,即在讲关键字参数的那个hello函数中, 我们还可以使用hello("王五"), hello("赵六")的形式进行调用,此时print(name)输出的值就不再是默认的"张三"了, 而是我们自定义的"王五","赵六".
-----
通过上面的讲解,应该能认出什么叫位置参数,什么叫关键字参数了,其特征(一个是变量名, 一个是等式)和用法(一个是必须传值,一个是可传可不传)应该也能明白了. 那么这里就再举一个同时含有 位置参数和关键字参数的例子:
按照之前讲的,调用person时,age必须要传值,name可传可不传,所以调用形式可以是:
person(18), 也可以是person(18,"李四") //同时把参数名加上进行调用也可以,即person(age=18,"李四"), person(age=18, name="李四"), person(18,name="李四")这都是合法的,当然如果看着乱,记住一种就好.
**.还有一点需要注意函数定义中,位置参数一定要位于关键字参数前,也就是说def person(name="张三",age)这么写是错误的(对于这条约定我是这么理解的, 你想啊假如位置参数位于关键字参数前是可行的,则我们在调用person时,即使name就是默认值"张三",我们也要传值, 因为如果你这么写,person(18),则18会传给person的第一个参数name,如果你写person("张三",18)又麻烦了,因为name的默认值就是"张三', 但我觉得使用person(age=18)还可以理解呀,不管怎么样吧,记住规矩就是这样的.).
-----
下面就该引出题主问题中所谓的"不定长参数"了. 我感觉叫"任意数量的参数"更好理解一些,因为重点在于数量,而不在于长度.//至少如果我没有看到你的实际题目,你说"不定长参数"我会理解为一个参数的值的长度不限, 而非可以有任意多个参数.
为了迎合题主, 下面就称"不定长参数"吧.
python中一般不定长参数有两种类型,位置不定长参数和关键字不定长参数, 其外在特征是:
位置不定长参数由一个星号+变量名组成: *var //var是我随意写的,可以是*a,*b,*any等
关键字不定长参数由两个星号+变量名组成: **key //同理,key也可以是任意名称.
-----
不定长参数的出现其实就是为了增加函数的灵活性, 这个灵活性就体现在"可以表示任意多个参数位置参数和或关键字参数".
-----
最后再说回题主的问题:
def hh(w,**l,pu='d')
这个用法不对, pu='d'要放在**l前面,我说下原因:
先看一下hh这个函数中的参数类型有两种, w是位置参数; **l和pu='d'是关键字参数.
因此w放在最前面没毛病(位置参数要位于关键字参数前面), 而为什么pu='d'要放在**l前面呢,因为**l表示所有的关键字参数都要传给l,所以如果pu='d'写在**l后面,则pu='d'就不起作用了,因此不能这样写.
=====
希望可以帮到题主, 欢迎追问.
python不定长参数怎么实现乘法
只需要修改矩阵并传入参数即可。
经资料查询,不定长参数实现乘法,只需要修改矩阵并传入参数即可。
Python是一种广泛使用的解释型、高级和通用的编程语言。Python由荷兰数学和计算机科学研究学会的Guido van Rossum创造,第一版发布于1991年,它是ABC语言的后继者,也可以视之为一种使用传统中缀表达式的LISP方言。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。
本文标题:python不定长函数 python 长度函数
标题路径:http://scgulin.cn/article/hijsje.html