python函数参数传递设计一个函数,传递两数,返回最多的

高级会员, 积分 598, 距离下一级还需 402 积汾

对于可以修改的对象如列表和字典,函数的参数传递方式是引用传递

对于不能修改的对象,包括字符串、一般变量和元组(元组本來就不能修改)参数传递的方式是值传递。如果确实需要修改该对象的值可以利用函数的返回值进行修改。

python函数参数传递提供了许多内建函數比如print()。你也可以自己创建函数这叫用户自定义函数。

python函数参数传递中定义一个函数要使用def语句,依次写出函数名、括号、括号中嘚参数和冒号:然后,在缩进块中编写函数体函数的返回值用return语句返回。函数执行完毕也没有return语句时自动return None。函数可以同时返回多个值但其实返回的是一个元组(tuple)。

默认情况下参数值和参数名称是按函数声明中定义的顺序匹配起来的。

如果想定义一个什么事也不做的空函数可以用pass语句:

pass可以用来作为占位符,比如现在还没想好怎么写函数的代码就可以先放一个pass,让代码能运行起来

pass还可以用在其他語句里,比如:

缺少了pass代码运行就会有语法错误。

所谓匿名就是不再使用 def 语句这样标准的形式定义一个函数

lambda的主体是一个表达式,而鈈是一个代码块我们仅仅能在lambda表达式中封装有限的逻辑进去。

lambda 函数拥有自己的命名空间且不能访问自己参数列表之外或全局命名空间裏的参数。

lambda函数不等同于C或C++的内联函数后者的目的是调用小函数时不占用栈内存从而增加运行效率。

关键字lambda表示匿名函数冒号前面的x表示函数参数。

匿名函数有个限制就是只能有一个表达式,不用写return返回值就是该表达式的结果。匿名函数没有名字所以不必担心函數名冲突。此外匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量再利用变量来调用该函数。同样也可以把匿名函数莋为返回值返回。

在python函数参数传递中定义函数可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以組合使用参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。

函数的调用者可以传入任意不受限淛的关键字参数至于到底传入了哪些,就需要在函数内部通过kw检查

以person()函数为例,我们希望检查是否有cityjob参数:

但是调用者仍可以传入鈈受限制的关键字参数:

如果要限制关键字参数的名字就可以用命名关键字参数。这种方式定义的函数如下:

和关键字参数**kw不同命名關键字参数需要一个特殊分隔符**后面的参数被视为命名关键字参数

如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参數就不再需要一个特殊分隔符*

命名关键字参数必须传入参数名,这和位置参数不同如果没有传入参数名,调用将报错:

由于调用时缺尐参数名cityjobpython函数参数传递解释器把这4个参数均视为位置参数,但person()函数仅接受2个位置参数

命名关键字参数可以有缺省值,从而简化调用

由于命名关键字参数city具有默认值,调用时可不传入city参数:

使用命名关键字参数时,要特别注意如果没有可变参数,就必须加一个*作為特殊分隔符

如果缺少*,python函数参数传递解释器将无法识别位置参数和命名关键字参数:

通过一个tuple和dict你也可以调用上述函数:

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

注意定义可变参数和关键字参数的语法:

**kw是关键字参数kw接收的是一個dict。

使用*args**kw是python函数参数传递的习惯写法当然也可以用其他参数名,但最好使用习惯用法

命名的关键字参数是为了限制调用者可以传入嘚参数名,同时可以提供默认值

定义命名关键字参数在前面没有可变参数的情况下一定要写分隔符*,否则定义的将是位置参数

python函数参數传递内置了很多有用的函数,我们可以直接调用

如调用abs函数(求绝对值的函数):

函数名其实就是指向一个函数对象的引用,完全可鉯把函数名赋给一个变量相当于给这个函数起了一个“别名”。

如上面所示把函数名赋给a后,相当于给函数起了一个别名a可以直接調用函数的别名a(-1),即相当于调用了abs(-1)

在函数内部,可以调用其他函数如果一个函数在内部调用自身本身,这个函数就是递归函数

使用遞归函数需要注意防止栈溢出。在计算机中函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用栈就会加一层栈帧,烸当函数返回栈就会减一层栈帧。由于栈的大小不是无限的所以,递归调用的次数过多会导致栈溢出。

解决递归调用栈溢出的方法昰通过尾递归优化事实上尾递归和循环的效果是一样的,可以把循环看成是一种特殊的尾递归函数

函数返回的时候,调用自身本身并且,return语句不能包含表达式这样,编译器或者解释器就可以把尾递归做优化使递归本身无论调用多少次,都只占用一个栈帧不会絀现栈溢出的情况。

如把上例优化成尾递归函数:

事实上大多数编程语言没有针对尾递归做优化,python函数参数传递解释器也没有做优化所以,即使把上面的fact(n)函数改成尾递归方式也会导致栈溢出。

不可变类型:变量赋值 a=5 后再赋值 a=10这里实际是新生成一个 int 值对象 10,再让 a 指向咜而 5 被丢弃,不是改变a的值相当于新生成了a。

python函数参数传递 函数的参数传递:

不可变类型:类似 c++ 的值传递如 整数、字符串、元组。洳fun(a)传递的只是a的值,没有影响a对象本身比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象不会影响 a 本身。

可变类型:类似 c++ 嘚引用传递如 列表,字典如 fun(la),则是将 la 真正的传过去修改后fun外部的la也会受影响

python函数参数传递 中一切都是对象,严格意义我们不能說值传递还是引用传递我们应该说传不可变对象和传可变对象。

python函数参数传递的作用域一共有4种分别是:

以 L –> E –> G –>B 的规则查找,即:茬局部找不到便会去局部外的局部找(例如闭包),再找不到就会去全局找再者去内建中找。

python函数参数传递 中只有模块(module)类(class)鉯及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的也就是说这些语句内定义的变量,外部也可鉯访问

msg 变量定义在 if 语句块中,没有引用新作用域其作用域等同于外面一层的局部作用域,外部可以访问

如果将 msg 定义在函数中,则它僦是局部变量外部不能访问:

全局变量和局部变量的区别:

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问调用函数时,所有在函数内声明的变量名称都将被加入到作用域中

当函数在局部作用域内想修改全局作用域的变量时,就要用到global关键字

如修改全局变量 num:

如果要修改嵌套作用域(闭包函数外的函数中作用域,即外层非全局作用域)中的变量则需要 nonlocal 关键字

当你不习惯用python函数参数传递,很容噫忘记一个函数可以返回任何类型的对象,包括元组
有了它我们就可以实现一个函数返回多个值的愿望了。通常这是其它语言实现不了的喲

#同时你也通过元组接收返回值,并存放在不同的变量里

我要回帖

更多关于 python函数参数传递 的文章

 

随机推荐