python基础教程函数参数

python里有很多的内置函数给我们的工作带来了很多发便利,在我们实现某些功能或者优化代码的时候,可以自己定义一个函数,同时我们在定义一个类的时候也会用到函数的一些知识去构造一个方法,这里就涉及到一些关于函数的基础知识和函数传参的知识。

一、函数的相关介绍

1.函数定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可。

函数特性

  • 减少重复代码
  • 使程序变的可扩展
  • 使程序变得易维护

2、函数的定义示例

定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回


def echostr():       #用关键字def定义一个函数 

    print("Hello, world" )

echostr() #调用函数

结果:

Hello, world

def printstr(str1,str2,str3):
    return str1,str2,str3   #使用return返回参数
 
s=printstr("mysql","1929","baidu") #对调用函数,初始化s对象
print(s)                          #打印s

结果:
(‘mysql‘, ‘1929‘, ‘baidu‘)

一般情况下,在函数中使用return语句,会返回一个参数,而上面的我们返回了三个参数,这时就会输出一个元组,

print(type(s))

<class ‘tuple‘>  输出结果验证为元组

函数定义小结

  1. 定义函数时,需要确定函数名和参数个数;
  2. 如果有必要,可以先对参数的数据类型做检查;
  3. 函数体内部可以用return随时返回函数结果;
  4. 函数执行完毕也没有return语句时,自动return None。
  5. 函数可以同时返回多个值,但其实就是一个tuple。


3、简单的传参式定义示例

 下面的的示例中定义了3个参数a,b,c,在调用的过程中给传入mysql,1929,baidu三个参数分别给a,b,c.

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

printstr("mysql","1929","baidu")

结果:
mysql 1929 baidu

4、函数参数与局部变量

  在我们学习C语言之类的语言都会学过形参、实参的概念,而python里面也是存在形参和实参的概念。

形参变量 只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量。

实参变量 可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值。

默认参数:

  在我们我们设计产品时,特别有好多的地方会显示一些默认值,当你未传入值时就会传入默认参数,传入和,默认参数不一样的值时会替代默认参数。

def stuInfo(name,age,sex,address,telphone,shcool="清华大学"):
    print("The student name is:",name)
    print("The student age is:", age)
    print("The student sex is:", sex)
    print("The student address is:", address)
    print("The student telphone is:", telphone)
    print("The student shcool is:", shcool)

stuInfo("linux",18,"boy","北京","18393820785") #未传入默认参数shcool

执行结果:
****************************The First stuent info******************************
The student name is: linux
The student age is: 18
The student sex is: boy
The student address is: 北京
The student telphone is: 18393820785
The student shcool is: 清华大学

stuInfo("docker",2,"girl","上海","NULL","上海交通大学")#传入和默认参数值不同的参数
执行结果:
*****************************The Second stuent info*****************************
The student name is: docker
The student age is: 2
The student sex is: girl
The student address is: 上海
The student telphone is: NULL
The student shcool is: 上海交通大学

 默认参数注意点

一是必选参数(函数定义时所有的非默认参数)在前,默认参数在后,否则Python的解释器会报错(思考一下为什么默认参数不能放在必选参数前面);

传入变量时容易产生歧义,所以我们将默认参数放置在必选参数的最后,

二是如何设置默认参数。

当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。

使用默认参数有什么好处?最大的好处是能降低调用函数的难度。

关键字参数

在上面的示例中,使用的是按照参数定义的顺序传入参数,当我们定义的参数比较多的时候,就容易混乱,有一个关键字参数这时候就比较适合这种情景,同时使用关键字参数就可以打乱我们传入参数的顺序。

def stuInfo(name,age,sex,address,telphone,shcool="清华大学",):
    print("The student name is:",name)
    print("The student age is:", age)
    print("The student sex is:", sex)
    print("The student address is:", address)
    print("The student telphone is:", telphone)
    print("The student shcool is:", shcool)
stuInfo(name="docker",age=2,sex="girl",address="上海",telphone="NULL")#使用定义函数的关键字

结果:
The student name is: docker
The student age is: 2
The student sex is: girl
The student address is: 上海
The student telphone is: NULL
The student shcool is: 清华大学

 很明显,这样用关键字传入参数很清晰、明了,当我们排除异常和解决bug等都是比较好的方案。同时关键字参数还可以和我们定义的参数按照位置顺序(位置参数)结合使用,但是需要注意:关键参数必须放在位置参数之后

stuInfo("docker",2,sex="girl",address="上海",telphone="NULL")

执行结果:
*****************************The Second stuent info*****************************
The student name is: docker
The student age is: 2
The student sex is: girl
The student address is: 上海
The student telphone is: NULL
The student shcool is: 清华大学

stuInfo(name="docker",2,"girl","上海","NULL") #关键字参数在位置参数前面调用 会报错

执行结果:
  stuInfo(name="docker",2,"girl","上海","NULL")
                         ^
SyntaxError: positional argument follows keyword argument

执行报错  语法错误 关键字参数在位置参数的后面

注意点:

在定义函数、调用函数的过程中,必须记住,关键字参数必须放在位置参数的后面。

非固定参数*args

例如上面定义的函数,主要包含姓名、年龄、性别、家庭住址、手机号码、学校等信息,想要传入更多的参数,这时我们定义的参数就不能满足需求,这时我们就可以用非固定参数,在不确定他们传入多少个参数的时候就可以使用非固定参数。

def  stuInfo2(*args):
    print(xargs)

    return xargs
stuInfo2("docker"," ","girl","上海","NULL")

结果:

(‘docker‘, ‘ ‘, ‘girl‘, ‘上海‘, ‘NULL‘)

默认参数与非固定参数的结合
def stuInfo(name,age,sex,address,telphone,shcool="清华大学",*xargs):
    print("The student name is:",name)
    print("The student age is:", age)
    print("The student sex is:", sex)
    print("The student address is:", address)
    print("The student telphone is:", telphone)
    print("The student shcool is:", shcool)
    print("非固定变量:",xargs)

stuInfo("docker",2,"girl","上海","NULL","mysqlDBA","redis","python","java")

非固定参数**kwargs

除了上面介绍的*args非固定参数外,还有一种非固定参数**kwargs,*kwargs 会把多传入的参数变成一个dict形式。

**kwargs 允许你将不定长度的键值对, 作为参数传递给一个函数。 如果你想要在一个函数里处理带名字的参数, 你应该使用**kwargs。

在函数中处理键值参数

def greet_me(**kwargs):
    for key, value in kwargs.items():
        print("{0} == {1}".format(key, value))

greet_me(name="alibaba") #调用函数
greet_me(obc="mysql")  #调用函数
结果:
name == alibaba
obc == mysql
def stu_info(name,age,*args,**kwargs): # *kwargs 会把多传入的参数变成一个dict形式
    print(name,age,args,kwargs)

stu_info("jack",32,"baidu","python",job1="mysqlDBA",job2="linux SRE")

jack 32 (‘baidu‘, ‘python‘) {‘job2‘: ‘linux SRE‘, ‘job1‘: ‘mysqlDBA‘}

*args参数结果是一个tuple型的

**kwargs参数结果是字典型,键值形式的。

组合参数

在Python中定义函数,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是请注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

例如:

def f1(a, b, c=0, *args, **kw):
    print(‘a =‘, a, ‘b =‘, b, ‘c =‘, c, ‘args =‘, args, ‘kw =‘, kw)

def f2(a, b, c=0, *, d, **kw):
    print(‘a =‘, a, ‘b =‘, b, ‘c =‘, c, ‘d =‘, d, ‘kw =‘, kw)

f1(1,2)
f1(1,2,c=3)
f1(1,2,3,"a","b")
f1(1,2,3,‘a‘,‘b‘,x=99)
f2(1,2,d=99,ext=None)

结果:
a = 1 b = 2 c = 0 args = () kw = {}
a = 1 b = 2 c = 3 args = () kw = {}
a = 1 b = 2 c = 3 args = (‘a‘, ‘b‘) kw = {}
a = 1 b = 2 c = 3 args = (‘a‘, ‘b‘) kw = {‘x‘: 99}
a = 1 b = 2 c = 0 d = 99 kw = {‘ext‘: None}

*xargs、**kwargs还通过一个tuple和dict,调用我们定义好的参数,例如

args = (1, 2, 3, 4)
kw={‘d‘: "baidy", ‘x‘: ‘191991‘}
f1(*args,**kw)
结果:
a = 1 b = 2 c = 3 args = (4,) kw = {‘d‘: ‘baidy‘, ‘x‘: ‘191991‘}

对于任何函数,都可以通过类似func(*args, **kw)的形式调用它,无论它的参数是如何定义的。

此外,其实并不是必须写成*args 和**kwargs。 只有变量前面的 *(星号)才是必须的. 你也可以写成*var 和**vars. 而写成*args 和**kwargs只是一个通俗的命名约定。

参数小结:

  • Python的函数具有非常灵活的参数形态,既可以实现简单的调用,又可以传入非常复杂的参数。
  • 默认参数一定要用不可变对象,如果是可变对象,程序运行时会有逻辑错误!
  • 要注意定义可变参数和关键字参数的语法:
  • *args是可变参数,args接收的是一个tuple;
  • **kw是关键字参数,kw接收的是一个dict。
  • 以及调用函数时如何传入可变参数和关键字参数的语法:
  • 可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3))
  • 关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{‘a‘: 1, ‘b‘: 2})
  • 使用*args**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。
  • 命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。
  • 定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数
时间: 2024-10-01 11:35:57

python基础教程函数参数的相关文章

python基础教程——函数

定义函数 //abstest.py def my_abs(x): if x >= 0: return x else: return -x 在该文件的当前目录下启动python解释器,用 from abstest import my_abs 来导入my_abs()函数. 定义可变参数: def calc(*numbers): sum = 0 for n in numbers: sum = sum + n*n return sum >>calc(1,2) 5 >>calc() 0

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

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

python基础教程(第二版)

开始学习python,根据Python基础教程,把里面相关的基础章节写成对应的.py文件 下面是github上的链接 python基础第1章基础 python基础第2章序列和元组 python基础第3章使用字符串 python基础第4章字典 python基础第5章循环 python基础第6章函数和魔法参数 python基础第7章类 python基础第8章异常 python基础第9章魔法方法.属性和迭代器 python基础第11章文件 python基础第12章GUI(wxPython) pytho

Python基础教程(第十章 自带电池)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5459376.html______ Created on Marlowes 现在已经介绍了Python语言的大部分基础知识.Python语言的核心非常强大,同时还提供了更多值得一试的工具.Python的标准安装中还包括一组模块,称为标准库(standard library).之前已经介绍了一些模块(例如math和cmath,其中包

python基础教程_学习笔记23:图形用户界面

图形用户界面 丰富的平台 在编写Python GUI程序前,需要决定使用哪个GUI平台. 简单来说,平台是图形组件的一个特定集合,可以通过叫做GUI工具包的给定Python模块进行访问. 工具包 描述 Tkinter 使用Tk平台.很容易得到.半标准. wxpython 基于wxWindows.跨平台越来越流行. PythonWin 只能在Windows上使用.使用了本机的Windows GUI功能. JavaSwing 只能用于Jython.使用本机的Java GUI. PyGTK 使用GTK

python基础教程_学习笔记3:元组

元组 元组不能修改:(可能你已经注意到了:字符串也不能修改.) 创建元组的语法很简单:如果用逗号分隔了一些值,那么你就自动创建了元组. >>> 1,3,'ab' (1, 3, 'ab') 元组也是(大部分时候是)通过圆括号括起来的. >>> (1,3,'13') (1, 3, '13') 空元组可以用没有内容的两个圆括号来表示. 如何实现包括一个值的元组呢? >>> (5) 5 >>> ('ab') 'ab' >>>

Python基础教程(第六章 抽象)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5351415.html______ Created on Xu Hoo 本章将会介绍如何将语句组织成函数,这样,你可以告诉计算机如何做事,并且只需要告诉一次.有了函数以后,就不必反反复复像计算机传递同样的具体指令了.本章还会详细介绍参数(parameter)和作用域(scope)的概念,以及地柜的概念及其在程序中的用途. 6.1

python基础教程_学习笔记9:抽象

抽象 懒惰即美德. 抽象和结构 抽象可以节省大量工作,实际上它的作用还要更大,它是使得计算机程序可以让人读懂的关键. 创建函数 函数可以调用(可能包含参数,也就是放在圆括号中的值),它执行某种行为并且返回一个值.一般来说,内建的callable函数可以用来判断函数是否可调用: >>> import math >>> y=1 >>> x=math.sqrt >>> callable(x) True >>> callab

python基础教程_学习笔记10:异常

异常 什么是异常 Python用异常对象来表示异常情况.遇到错误后,会引发异常.如果异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止执行: >>> 1/0 Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> 1/0 ZeroDivisionError: integer division or modulo by