Python基础:11.2_函数调用

我们已经接触过函数(function)的参数(arguments)传递。当时我们根据位置,传递对应的参数。这种参数传递的方式被称为函数参数的位置传递

我们将接触更多的参数传递方式。

回忆一下位置传递:

def f(a,b,c):
    return a+b+c

res = f(1,2,3)
print res

  在调用f函数时,1,2,3根据位置分别传递给了a,b,c。

关键字传递



有些情况下,用位置传递会感觉比较死板。关键字(keyword)传递是根据每个参数的名字传递参数。关键字并不用遵守位置的对应关系。依然沿用上面f的定义,更改调用方式:

res = f(c=3, b=2, a=1)
print res

关键字传递可以和位置传递混用。但位置参数要出现在关键字参数之前:

res = f(1, c=3, b=2)
print res

在关键字参数和位置参数混用的时候,如果不遵循上面的规则,则会报错:non-keyword arg after keyword arg

res = f(a=1, 2, c=3)
print res

默认参数



定义函数的时候,使用形如a=19的方式,可以给参数赋予默认值(default)。如果该参数最终没有被传递值,将使用该默认值。

def f(a,b,c=10):
    return a+b+c

res = f(3,2)
print res

res = f(3,2,1)
print res

在第一次调用函数f时, 我们并没有足够的值,c没有被赋值,c将使用默认值10.

第二次调用函数的时候,c被赋值为1,不再使用默认值。

还有一个规则:在函数定义的时候,必须把带默认值的参数放在后面

包裹传递



定义函数时,我们有时候并不知道调用的时候会传递多少个参数。这时候,包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会非常有用。
包裹传递有两种方式:通过元组包裹或者通过字典包裹

(1)元组包裹

下面是元组包裹位置传递的例子:

def func(*name):
    print type(name)
    print name

func(1,4,6)
func(5,6,7,1,2,3)

两次调用,尽管参数个数不同,都基于同一个func定义。在func的参数表中,所有的参数被name收集,根据位置合并成一个元组(tuple),这就是包裹位置传递

为了提醒Python参数:name是包裹位置传递所用的元组名,在定义func时,在name前加*号

(2)字典包裹

下面是字典包裹关键字传递的例子:

def func(**dict):
    print type(dict)
    print dict

func(a=1,b=9)
func(m=2,n=1,c=11)

与上面一个例子类似,dict是一个字典,收集所有的关键字,传递给函数func。为了提醒Python,参数dict是包裹关键字传递所用的字典,在dict前加**

包裹传递的关键在于定义函数时,在相应元组或字典前加*或**。

解包裹



*和**,也可以在调用的时候使用,即解包裹(unpacking)

(1)元组按位置解包裹

下面为例:

def func(a,b,c):
    print a,b,c

args = (1,3,4)
func(*args)

在这个例子中,所谓的解包裹,就是在传递tuple时,让tuple的每一个元素对应一个位置参数。在调用func时使用*,是为了提醒Python:我想要把args拆成分散的三个元素,分别传递给a,b,c。(设想一下在调用func时,args前面没有*会是什么后果?)

如果不用解包裹的话,函数调用就会出现函数参数的类型Error。

(2)字典按关键字解包裹

相应的,也存在对词典的解包裹,使用相同的func定义,然后:

dict = {‘a‘:1,‘b‘:2,‘c‘:3}
func(**dict)

在传递词典dict时,让词典的每个键值对作为一个关键字传递给func,这里的参数的传递是关键字参数,也就是说func的形参是a,b,c,那么dict字典的键值对的键也要是a,b,c不能是其他的。(a,b,c的顺序不重要)。

混合



在定义或者调用参数时,参数的几种传递方式可以混合。但在过程中要小心前后顺序。基本原则是:先位置,再关键字,再包裹位置,再包裹关键字,并且根据上面所说的原理细细分辨。

注意:请注意函数定义时和函数调用时的区分。包裹和解包裹并不是相反操作,是两个相对独立的过程。

时间: 2024-11-05 21:56:25

Python基础:11.2_函数调用的相关文章

python基础学习2_交互input

input用于与用户交互,就像shell脚本read一样. 示例1: #!/usr/bin/env python #_*_ coding:utf-8 _*_ name = raw_input('请输入您的名字: ') age = raw_input('年龄:') job = raw_input('工作:') salary = raw_input('工资:') print ''' ---------------------------- Personal information of %s: Na

python基础11 ---函数模块1

函数模块 一.函数模块的作用(为什么要有函数模块) 1.函数模块可以减少代码量 2.函数模块方便阅读 3.函数模块维护性强二.函数模块的本质以及调用方法 1.函数模块的本质就是一个.py结尾的文件,该文件内写入大量函数 2.必须用import来引用函数模块,在调用函数模块时必须以"模块名.函数名"来调用函数模块中的函数. 3.有的时候我们只需要用到模块中的某个函数,也可以用"from 模块名 improt 函数1,函数2"的方式来引用该模块,但只是一次引用,不建议使

python基础11(函数三)

一.函数参数的类型 之前我们接触到的那种函数参数定义和传递方式叫做位置参数,即参数是通过位置进行匹配的,从左到右,依次进行匹配,这个对参数的位置和个数都有严格的要求.而在Python中还有一种是通过参数名字来匹配的,这样一来,不需要严格按照参数定义时的位置来传递参数,这种参数叫做关键字参数. >>> def display(a,b): print a print b >>> display('hello','world') # 位置参数,即参数是通过位置进行匹配 hel

python基础11 文件操作 ,字符编码

主要内容 文件操作 文件操作 打开文件的模式 打开文件的模式有: r,只读模式(默认). w,只写模式.[不可读:不存在则创建:存在则删除内容:] a,追加模式.[可读:不存在则创建:存在则只追加内容:] "+" 表示可以同时读写某个文件 r+,可读写文件.[可读:可写:可追加] w+,写读 a+,同a r+:可读可写,若文件不存在,报错:w+: 可读可写,若文件不存在,创建. "U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模

Python基础11—图形界面编程

一.弹出消息框 要编辑消息框,首先要导入tkinter的messagebox,导入方法:from tkinter.messagebox import * ①弹出提示消息框:showinfo(title='标题',message='内容') ②弹出警告消息框:showwarning(title='标题',message='内容') ③弹出错误消息框:showerror(title='标题',message='内容') 1 from tkinter.messagebox import * 2 sho

python基础教程_学习笔记11:魔法方法、属性和迭代器

魔法方法.属性和迭代器 在python中,有的名称会在前面和后面各加上两个下划线,这种写法很特别.它表示名字有特殊含义,所以绝不要在自己的程序中使用这种名字.在python中,由这些名字组成的集合所包含的方法叫做魔法(或称特殊)方法.如果对象实现了这些方法中的某一个,那么这个方法会在特殊的情况下被python调用,而几乎没有直接调用它们的必要. 准备工作 为了确保类是新型的,应该把赋值语句__metaclass__=type放在你的模块的最开始,或者(直接或间接)子类化内建类(实际上是类型)ob

python基础学习11(核心编程第二版)部分

# -*- coding: utf-8 -*- # ==================== #File: python #Author: python #Date: 2014 #==================== __author__ = 'Administrator' #执行环境 #可调用对象 """ 许多的python 对象都是我们所说的可调用的,即是任何能通过函数操作符“()”来调用的对象.要调用可调用对象, 函数操作符得紧跟在可调用对象之后.Python 有4

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

Python 基础 - Day 4 Learning Note - Generator 生成器

列表生成器/列表解析 list comprehension 简单灵活地创建列表,通常和lambda(), map(), filter() 一起使用 通过列表生成式, 直接创建列表.但是,收到内容限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问几个元素,那其他的就白占空间.列表生成器能够一边循环一边计算,大大节省大量的空间.是生成器的一种. 只有调用,才能生成. 不支持切片操作,只能通过__next()___一个个取数字. 基本语法