设为首页收藏本站

Crossin的编程教室

 找回密码
 立即加入
查看: 30442|回复: 16
打印 上一主题 下一主题

【Python 第67课】函数的参数传递(1)

[复制链接]

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

跳转到指定楼层
楼主
发表于 2014-5-12 17:08:50 |只看该作者 |正序浏览

本篇面向读者:有一点点 Python 基础
关键字:函数,参数,默认值

先说下上次课最后留的那题,我自己的解法:
print ';'.join([str(i) for i in range(1,101) if i % 2 == 0 and i % 3 == 0 and i % 5 == 0])

另外,关于上次说的 List Comprehension,我在文中称之为“列表综合”,这是引自《简明 Python 教程》的翻译。也有同学表示叫做“列表解析”或“列表表达式”。都是一个意思,其实在写这课之前,我从来都不去“叫”它,只知道这么用而已。

===================

我们曾经讲过 Python 中函数的参数传递(见第21课)。最基本的方式是:

定义
def func(arg1, arg2):
        print arg1, arg2

调用
func(3, 7)

我们把函数定义时的参数名(arg1、arg2)称为形参,调用时提供的参数(3、7)称为实参。

这种方式是根据调用时提供参数的位置进行匹配,要求实参与行参的数量相等,默认按位置匹配参数。调用时,少参数或者多参数都会引起错误。这是最常用的一种函数定义方式。

在调用时,也可以根据形参的名称指定实参。如:

func(arg2=3, arg1=7)

但同样,必须提供所有的参数。看看和func(3, 7)的运行结果有什么不同。


Python 语言还提供了其他一些更灵活的参数传递方式,如:

func2(a=1, b=2, c=3)
func3(*args)
func4(**kargs)

今天我们先说说func2这种方式。

这种方式可以理解为,在一般函数定义的基础上,增加了参数的默认值。这样定义的函数可以和原来一样使用,而当你没有提供足够的参数时,会用默认值作为参数的值。

例如:

定义
def func(arg1=1, arg2=2, arg3=3):
        print arg1, arg2, arg3

调用
func(2, 3, 4)
func(5, 6)
func(7)

输出为
2 3 4
5 6 3
7 2 3

提供的参数会按顺序先匹配前面位置的参数,后面未匹配到的参数使用默认值。

也可以指定其中的部分参数,如:

func(arg2=8)
func(arg3=9, arg1=10)

输出为
1 8 3
10 2 9

或者混合起来用:

func(11, arg3=12)

输出为
11 2 12

但要注意,没有指定参数名的参数必须在所有指定参数名的参数前面,且参数不能重复。以下的调用都是错误的:

func(arg1=13, 14)
func(15, arg1=16)


定义参数默认值的函数可以在调用时更加简洁。大量 Python 模块中的方法都运用了这一方式,让使用者在调用时可以提供尽可能少的参数。

接下来的几次课,我会继续介绍其他的参数传递方式。


#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

17#
发表于 2018-10-26 00:44:19 |只看该作者
marvinmi 发表于 2018-10-23 16:14
先生打扰了,麻烦看一下但是我觉得这两个是一个意思啊,是我哪里理解错了吗 ...

因为arg1重复了
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

36

积分

新手上路

Rank: 1

16#
发表于 2018-10-23 16:14:30 |只看该作者
先生打扰了,麻烦看一下
  1. 您说混合起来使用是这个:
  2. func(11, arg3=12)
  3. 然后说下面这么使用是错误的:
  4. func(15, arg1=16)
复制代码
但是我觉得这两个是一个意思啊,是我哪里理解错了吗
回复

使用道具 举报

0

主题

0

好友

12

积分

新手上路

Rank: 1

15#
发表于 2017-11-21 13:55:17 |只看该作者
Crossin先生,讲的真好,点赞
回复

使用道具 举报

0

主题

0

好友

44

积分

新手上路

Rank: 1

14#
发表于 2017-8-9 15:57:44 |只看该作者
crossin先生 发表于 2017-8-8 23:51
不是。不定长参数的专门写法,后面课程里有具体说明

谢谢老师,后面的已经看过了。
回复

使用道具 举报

174

主题

45

好友

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

13#
发表于 2017-8-8 23:51:05 |只看该作者
qtjason 发表于 2017-8-7 23:08
func3(*args)
func4(**kargs)
请问,上面的*表示什么?是前面正则表达式里表示任意长度包括0 吗? ...

不是。不定长参数的专门写法,后面课程里有具体说明
#==== Crossin的编程教室 ====#
微信ID:crossincode
网站:http://crossincode.com
回复

使用道具 举报

0

主题

0

好友

16

积分

新手上路

Rank: 1

12#
发表于 2017-8-8 16:13:03 |只看该作者
qtjason 发表于 2017-8-7 23:08
func3(*args)
func4(**kargs)
请问,上面的*表示什么?是前面正则表达式里表示任意长度包括0 吗? ...

*表示不定参数, **表示关键字参数

def f(*args):
    print(args)

f(1,2,3,4,5,6)

执行一下试试
回复

使用道具 举报

0

主题

0

好友

44

积分

新手上路

Rank: 1

11#
发表于 2017-8-7 23:10:08 |只看该作者
qtjason 发表于 2017-8-7 23:08
func3(*args)
func4(**kargs)
请问,上面的*表示什么?是前面正则表达式里表示任意长度包括0 吗? ...

发现下一课里有提及,没问题了
回复

使用道具 举报

0

主题

0

好友

44

积分

新手上路

Rank: 1

10#
发表于 2017-8-7 23:08:08 |只看该作者
func3(*args)
func4(**kargs)
请问,上面的*表示什么?是前面正则表达式里表示任意长度包括0 吗?
回复

使用道具 举报

0

主题

0

好友

53

积分

注册会员

Rank: 2

9#
发表于 2017-4-6 17:02:51 |只看该作者

回帖奖励 +11

还有奖励么……
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即加入

QQ|手机版|Archiver|Crossin的编程教室 ( 苏ICP备15063769号  

GMT+8, 2024-11-22 00:29 , Processed in 0.017876 second(s), 23 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部