python之函数参数(三)

1.python函数的四类参数

python函数的参数可以分为位置参数默认参数关键字参数可变参数,函数可以没有参数,也可以有多个参数,参数是传递给函数的命名变量。

2.形参和实参

#coding=utf-8;
def print_diamond(count):
    for i in range(count): #range 生成一个整数序列 range(3):0,1,2
        if i <= count//2:  # //整数除法
            print(" "*(count//2-i)  + "*"*(2*i + 1))
        else:
            print(" "*(i - count//2)  + "*"*((count-i)*2-1))

print_diamond(7)

所谓形参,就是函数定义中的参数,形参在函数体内可以使用,而实参,则出现在调用过程中。

上面的代码中,函数定义中的count就是形参,而最后一行的代码中,7就是实参,形参代表一种形式,实参,是实际的具体的起作用的数据。

3.必传参数(位置参数)

def sum(a,b):
    sums = a+b;
    return sums;
print sum(1);

缺少参数会报错:

Traceback (most recent call last):
  File "C:/Users/m/PycharmProjects/liangbosheng/hanshus/mustcanshu.py", line 4, in <module>
    print sum(1);
TypeError: sum() takes exactly 2 arguments (1 given)

 4.默认参数

my_print函数根据count参数输出指定次数的content,我希望在两次输出的空档可以暂停一段时间,因此增加一个sleep参数。

import time
def my_print(content, count, sleep=1):
    for i in range(count):
        print(content)
        time.sleep(1)

my_print('ok', 3);

在调用函数时,我并没有传sleep这个形参,程序并没有报错,这是因为在定义函数的时候,给了sleep形参默认值1,这意味着,如果调用函数时没有传这个参数,python会用默认值来执行函数。默认值参数非常用有用,假设你在系统里的很多地方都使用最开始定义的my_print函数。

def my_print(content, count):
    pass

开始某一天,你需要增加一个参数sleep, 如果你将sleep定义为必传参数,那么所有用到函数my_print的地方都必须修改调用时的代码来增加这个入参,但如果你把sleep定义为默认参数,sleep已经默认等于1,除非必须传入其他的数值,否则就不需要这么做,之前的代码仍然可以使用。

定义函数是时,如果有多个默认参数,他们必须放置在参数列表的最后,不允许在中间放置一个必传参数。

 5.关键字参数

关键字参数不是一个出现在函数定义时的概念,而是一个出现在函数调用时的概念。

import time


def my_print(content, count, sleep=1):
    for i in range(count):
        print(content)
        time.sleep(1)

my_print(count=2, content='关键字参数', sleep=2)

在调用函数时,我使用了key=value的形式来传递参数,不仅如此,还打乱了顺序,先传入了count,后传入了content,关键字参数允许你以任何顺序传递参数,只要必传参数都以key=value的形式传值即可。现在,你应该明白我前面所讲的,关键字参数是出现在函数调用时的概念。

使用关键字参数,可以让参数传递更加明确,让调用方清楚的知道每个参数的传值情况。

6.可变参数

可变参数分为两种:
1.*args 接受任意多个实际参数
2.**kwargs接收任意多个以关键字参数赋值的实际参数

6.1 *args 实例

#coding=utf-8;
def kebian(*args):
    print args,type(args);
    for i in args:
        print i;
    return 0;
kebian(2);
kebian(2,3);
kebian(4,5,6);
kebian(7,8,9,10);

执行结果:

(2,) <type 'tuple'>
2
(2, 3) <type 'tuple'>
2
3
(4, 5, 6) <type 'tuple'>
4
5
6
(7, 8, 9, 10) <type 'tuple'>
7
8
9
10

你可以看到,我在定义kebian时,使用*args, args只是个名字,你可以随意修改,关键是前面有一个星。有了这个星,函数调用时传递多少个参数就变成了一个很随意的事情,所有传入的参数将被放入到一个元组中,因此args的类型是tuple元组。

6.2 **args 实例

def dictcanshu(**args):
    print args,type(args);
    for i,j in  args.items():
        print i,j;
    return 0;
dictcanshu(a=2,b=4,c=6);
dictcanshu(age=16,name="ben",country="japen");

在调用函数时,以关键字参数的形式进行参数传递,最终这些key-value对将组装成字典,args的类型是dict。

 

posted @ 2022-09-14 17:48  家乐福的搬砖日常  阅读(79)  评论(0编辑  收藏  举报