函数非固定参数

1、默认参数:

代码如下:

def information_register(name,age,country,sex):
print("----注册信息------")
print("姓名:",name)
print("age:",age)
print("国籍:",country)
print("课程:",course) information_register("山炮",22,"CN","男")
information_register("二狗",21,"CN","男")
information_register("三傻",25,"CN","女")

以上country 这个参数 基本都 是"CN", 就像我们在网站上注册用户,像国籍这种信息,你不填写,默认就会是 中国, 这就是通过默认参数实现的,把country变成默认参数非常简单:

def information_register(name,age,sex,country="CN"):
print("----注册信息------")
print("姓名:",name)
print("age:",age)
print("国籍:",country)
print("课程:",course) information_register("山炮",22,"男")
information_register("二狗",21,"男")
information_register("三傻",25,"女")

对,只需要把创建country这个形参的时候给它传一个实参就可以:country="CN"。这样就成了默认参数,这个参数在调用时不指定,那默认就是CN,指定了的话,就用你指定的值。另外要注意的一点就是 :我把country变成默认参数后,把他的位置放到了最后,这个是因为关键字参数不能放在位置参数前面,这一点我们上一节随笔有举例子验证。

2、非固定位置参数:*args

作用:接收N个位置参数,转换成元组的形式

def test(*args): #形参必须以*开头,args参数名随便定义,但是最好按规范来,定义成args
print(args) test(1,2,3,4,5) #输入多个位置参数 #输出
(1, 2, 3, 4, 5) #多个参数转换成元组

(1)、 不传值,传入列表

def test(*args):
print(args) print("-------data1-----")
test() #如果什么都不传入的话,则输出空元组
print("-------data2-----")
test(*[1,2,3,4,5]) #如果在传入的列表的前面加*,输出的args = tuple([1,2,3,4,5])
print("-------data3-----")
test([1,2,3,4,5]) #如果再传入的列表前不加*,则列表被当做单个位置参数,所以输出的结果是元组中的一个元素 #输出
-------data1-----
()
-------data2-----
(1, 2, 3, 4, 5)
-------data3-----
([1, 2, 3, 4, 5],)

(2)、位置参数和非固定位置参数*args

def test(x,*args):
print(x) #位置参数
print(args) #非固定参数 test(1,2,3,4,5,6) #输出
1
(2, 3, 4, 5, 6)

第一个实参是形参X 的值,后面的值就变成了非固定位置参数的*args的实参了

(3)、 关键字参数和非固定位置参数*args

def test(x,*args):
print(x)
print(args) test(x=1,2,3,4,5,6) #输出
File "D:/PycharmProjects/pyhomework/day3/非固定参数/非关键字参数.py", line 21
test(x=1,2,3,4,5,6)
^
SyntaxError: positional argument follows keyword argument #位置参数在关键字参数后面

显然报错了,因为x=1是关键字参数,*args是位置参数,而关键字参数不能再位置参数前面的,所以报错,只要把关键字参数放在位置后面就可以了,代码如下:

def test(*args, x):
print(x)
print(args) test(2,3,4,5,6, x=1) #
#(2, 3, 4, 5, 6)

3、非固定关键字传参:**kwargs

作用:把N个关键字参数,转换成字典形式

def test(**kwargs): #形参必须以**开头,kwargs参数名随便定义,但是最好按规范来,定义成kwargs
print(kwargs) test(name="qigao",age=18) #传入多个关键字参数 #输出
{'name': 'qigao', 'age': 18} #多个关键字参数转换成字典

(1)、传入字典

def test(**kwargs):
print(kwargs) test(**{"name":"qigao","age":18}) #传入字典时,一定要在字典前面加**,否则就会报错 #输出
{'name': 'qigao', 'age': 18}
传入字典时,一定要在字典前面加**,否则就会报错验证,代码如下:
def test(**kwargs):
print(kwargs) test({"name":"qigao","age":18}) #输出
Traceback (most recent call last):
File "D:/PycharmProjects/pyhomework/day3/非固定参数/非固定关键字参数.py", line 9, in <module>
test({"name":"qigao","age":18})
TypeError: test() takes 0 positional arguments but 1 was given #报类型错误,传入的是位置参数

因为传入的字典被当做位置参数,所以被报类型错误,所以:传字典,加**

(2)、位置参数和非固定关键字参数:**keargs

def test(name,**kwargs):
print(name)
print(kwargs) print("------data1-----")
test("qigao") #1个位置参数
print("------data2------")
test("qigao",age=18,sex="M") #1个位置参数,两个关键字参数
print("------data3------")
test(name="qigao",age=18,sex="M") #3个关键字参数 #输出
------data1-----
qigao #输出1个位置参数
{} #没有输入关键字参数,所以输出空字典
------data2------
qigao #第1个位置参数
{'age': 18, 'sex': 'M'} #剩下关键字参数,转换成1个字典
------data3------
qigao #第1个关键字参数
{'age': 18, 'sex': 'M'} #剩下的关键字参数,转换成1个字典

(3)、位置参数、关键字和非固定关键字参数

def test(name,age=18,**kwargs):
print(name)
print(age)
print(kwargs) print("----------data1--------")
test("qigao",sex='M',hobby='tesl')
print("----------data2--------")
test("qigao",34,sex='M',hobby='tesl')
print("----------data3--------")
test("qigao",sex='M',hobby='tesl',age=34) #age关键字参数放到最后,也可以的 #输出
----------data1--------
qigao
18 #不传,显示默认参数
{'sex': 'M', 'hobby': 'tesl'}
----------data2--------
qigao
34 #传位置参数
{'sex': 'M', 'hobby': 'tesl'}
----------data3--------
qigao
34 #关键字参数,放在前后并没有影响
{'sex': 'M', 'hobby': 'tesl'}

注:如果遇到一个关键字传参和非固定关键字传参,前后放的位置是不影响传参的,但是我们一般还是按顺序来

(4)、位置参数、关键字参数、非固定位置参数和非固定关键字参数

def test(name,age=18,*args,**kwargs):
print(name)
print(age)
print(args)
print(kwargs) print("-------第1种传参--------")
test("qigao",19,1,2,3,4,sex="m",hobby="tesla")
print("-------第2种传参--------")
test("qigao",19,*[1,2,3,4],**{'sex':"m",'hobby':"tesla"}) #输出
-------第1种传参--------
qigao #传name位置参数
19 #给age传位置参数
(1, 2, 3, 4) #非固定位置参数,以转换成元组
{'sex': 'm', 'hobby': 'tesla'} # 非固定关键字参数,转换成字典
-------第2种传参---------
qigao
19
(1, 2, 3, 4) #以列表的形式传入,在列表前加*
{'sex': 'm', 'hobby': 'tesla'} #以字典的形式传入,在字典前加**

关键字参数不能再位置参数前面,同样的非固定关键字参数也不能在非固定位置参数前面,代码如下:

def test(name,age=18,*args,**kwargs):
print(name)
print(age)
print(args)
print(kwargs) test("qigao",19,sex="m",hobby="tesla",1,2,3,4,5) #输出
File "D:/PycharmProjects/pyhomework/day3/非固定参数/非固定关键字参数.py", line 57
test("qigao",19,sex="m",hobby="tesla",1,2,3,4,5)
^
SyntaxError: positional argument follows keyword argument #语法错误,关键字参数在位置参数前面

小结:

  1. 参数分为位置参数、关键字参数、默认参数、非固定位置参数和非固定关键字参数
  2. 位置参数之前传参,位置是不能调换的,多一个或者少一个参数都是不可以的。
  3. 关键字参数是不能放在位置参数前面的。
  4. 函数传参的位置顺序依次是,位置参数,默认参数、非固定位置参数、关键字参数、非固定关键字参数(def test(name,age=18,*args,**kwargs))
  5. 关键字传参,可以不用考虑位置的前后问题

返回值(return)

之前的随笔提到了return关键字,但是并没有详细的介绍的return关键字的用法,下面我们就来详细的阐述一下;

1.return的作用

 return其实有两个作用:

  • 需要用一个变量来接受程序结束后返回的结果
  • 它是作为一个结束符,终止程序运行
def test():
print("in the test_1")
return 0
print("the end") #结果中没有打印 x = test()
print(x) #输出
in the test_1 #第一次打印
0 #结果返回值

注:return 0后面的代码就不执行了,只执行return前面的代码;变量x接受了test()函数结束后的返回结果

2.返回多个值

上面的例子是返回来一个值,下面试一试无返回值,返回一个值,返回多个值的情况:

def test_1():
print("in the test_1") def test_2():
print("in the test_2")
return 0 def test_3():
print("in the test_3")
return 1,"hello",["qigao","shuaigao"],{"name":"qigao"} x = test_1()
y = test_2()
z =test_3()
print(x)
print(y)
print(z) #输出
in the test_1
in the test_2
in the test_3
None #x的值
0 #y的值
(1, 'hello', ['qigao', 'shuaigao'], {'name': 'qigao'}) #z的值

返回值return的作用?  -------因为我们想要想要这个函数的执行结果,这个执行结果会在后面的程序运行过程中需要用到

小实验:

一个函数体内部调用另外一个函数,代码如下:

def test(name,age=18,**kwargs):
print(name)
print(age)
print(kwargs)
test1() def test1():
print("hello") #在test1函数之后调用
test("qigao",age=23,sex="m",hobby="tesla") #输出
qigao
23
{'hobby': 'tesla', 'sex': 'm'}
hello

这样是正常的,可以完美运行的,下面调用函数的时候换一个位置,在test1函数定义之前,调用test函数:

def test(name,age=18,**kwargs):
print(name)
print(age)
print(kwargs)
test1() def test1():
print("hello") #在test1函数之后调用
test("qigao",age=23,sex="m",hobby="tesla") #输出
qigao
23
{'hobby': 'tesla', 'sex': 'm'}
Traceback (most recent call last):
File "D:/PycharmProjects/pyhomework/day3/局部变量和全局变量/test.py", line 12, in <module>
test("qigao",age=23,sex="m",hobby="tesla")
File "D:/PycharmProjects/pyhomework/day3/局部变量和全局变量/test.py", line 10, in test
test1()
NameError: name 'test1' is not defined #命名错误:test1没有被定义 

注: 在调用函数的时候,调用函数位置也很重要,就像虽然定义了test1函数,但是调用test函数的位置在test1之前,执行test函数的时候,test1函数还没有被读到内存中,所以报错

【python】-- 函数非固定参数,返回值(return)的更多相关文章

  1. 初识python 函数(定义,传参,返回值)

    python基础(二): 菜鸟教程基础知识讲解的非常全面,内容选择我认为的重点输出一遍 函数: 定义一个函数: 你可以定义一个由自己想要功能的函数,以下是简单的规则: def fun(arg): pa ...

  2. python函数入参和返回值

    以下内容参考自runoob网站,以总结python函数知识点,巩固基础知识,特此鸣谢! 原文地址:http://www.runoob.com/python3/python3-function.html ...

  3. python函数传参和返回值注意事项

    函数传参 空参数 定义函数时括号里面没有形参,调用时不用传参. def func(): print('null para.') # 调用 func() 位置传参 规定形参的数量,调用时必须传递相同数量 ...

  4. 自定义函数中的参数返回值 “-> (Int -> Int)”的问题

    func makeIncrementer() -> (Int -> Int) { func addOne(number: Int) -> Int { + number } retur ...

  5. python函数的使用和返回值

    #coding=utf-8 def a(): i=1a() #函数的返回值,用return语句实现 #一个返回值的情况def test(): i=7 return iprint test() #多个返 ...

  6. 函数的非固定参数-Day3

    一.函数非固定参数 1.默认函数,我们在传参之前,选给参数指定一个默认的值.默认参数特点是非必须传递的. def test(x,y=2): print(x) print(y) print(" ...

  7. python函数基础-参数-返回值-注释-01

    什么是函数 函数就是有特定功能的工具 # python中有内置函数(python解释器预先封装好的)与自定义函数(用户自定义封装的)之分 为什么要用函数 # 可以减少代码冗余,增加代码复用性 # 使代 ...

  8. day11 python学习 函数的建立,返回值,参数

    函数的定义主要有如下要点: def:表示函数的关键字 函数名:函数的名称,日后根据函数名调用函数 函数体:函数中进行一系列的逻辑计算,如:发送邮件.计算出 [11,22,38,888,2]中的最大数等 ...

  9. 函数和常用模块【day04】:函数的非固定参数(三)

    本节内容 1.概述 2.默认参数 3.参数组 4.总结 一.概述 在上一篇博客中我已经写了,位置参数和关键字参数,下面我们来谈谈默认参数和参数组 二.默认参数 默认参数指的是,我们在传参之前,先给参数 ...

随机推荐

  1. 转 : SQL Server数据库优化经验总结

    优化数据库的注意事项: 1.关键字段建立索引. 2.使用存储过程,它使SQL变得更加灵活和高效. 3.备份数据库和清除垃圾数据. 4.SQL语句语法的优化.(可以用Sybase的SQL Expert, ...

  2. Java Servlet 技术简介 from:IBM Dev

    点评:讲的没有太听懂. from: http://www.ibm.com/developerworks/cn/education/java/j-intserv/index.html#resources

  3. android项目 之 记事本(13) ----- 查看图片及播放录音

    本文是自己学习所做笔记,欢迎转载.但请注明出处:http://blog.csdn.net/jesson20121020 今天就来实现下查看图片及录音的功能,在编辑或者浏览记事时,点击图片.打开一个自己 ...

  4. IOS URL无法对加号进行编码导致http请求时服务器端获取的内容中加号变成空格问题

    一.背景. 将以下地址请求服务器时,如果postUrl中某个参数值包含符号+  那么在服务器获取到这个参数值时,其加号变成了一个空格. NSString *postUrl = "http地址 ...

  5. MySQL 事件EVENT

    一.用途用于某一时间执行一个事件或周期性执行一个事件. 二.语法CREATE [DEFINER = { user | CURRENT_USER }] EVENT [IF NOT EXISTS] eve ...

  6. Vue-cli + Express 构建的SPA Blog(前后分离)

    代码地址如下:http://www.demodashi.com/demo/12526.html 为什么学习并使用Vue 1.发展趋势 最近这几年的前端圈子,由于戏台一般精彩纷呈,从 MVC 到 MVV ...

  7. centos源码安装lnmp

    参考博客:http://blog.csdn.net/yanzi1225627/article/details/49123659 服务器环境为:CentOS6.6 64位(虚拟机) 一.安装前准备 创建 ...

  8. layer 不居中的坑爹问题

    使用了该代码弹出一个图片.但居然不居中 var layer_index = layer.open({ type: 1, title: false, closeBtn: 0, area: '516px' ...

  9. mysql更改表结构:添加、删除、修改字段、调整字段顺序

    添加字段: alter table `user_movement_log` Add column GatewayId int not null default 0 AFTER `Regionid` ( ...

  10. angularjs中的$q

    先说说什么是Promise,什么是$q吧.Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQuery的Deffered. 什么是Promise 以前了解过 ...