Python基础之函数用法实例详解

WBOY
Release: 2016-06-06 11:32:16
Original
958 people have browsed it

本文以实例形式较为详细的讲述了Python函数的用法,对于初学Python的朋友有不错的借鉴价值。分享给大家供大家参考之用。具体分析如下:

通常来说,Python的函数是由一个新的语句编写,即def,def是可执行的语句--函数并不存在,直到Python运行了def后才存在。

函数是通过赋值传递的,参数通过赋值传递给函数

def语句将创建一个函数对象并将其赋值给一个变量名,def语句的一般格式如下:

def <name>(arg1,arg2,arg3,……,argN):

  <statements>

Copy after login

def语句是实时执行的,当它运行的时候,它创建并将一个新的函数对象赋值给一个变量名,Python所有的语句都是实时执行的,没有像独立的编译时间这样的流程

由于是语句,def可以出现在任一语句可以出现的地方--甚至是嵌套在其他语句中:

if test:
  def fun():
    ...
else:
  def func():
    ...
...
func()
Copy after login

可以将函数赋值给一个不同的变量名,并通过新的变量名进行调用:

othername=func()
othername()
Copy after login

创建函数

内建的callable函数可以用来判断函数是否可调用:

>>> import math
>>> x=1
>>> y=math.sqrt
>>> callable(x)
False
>>> callable(y)
True
Copy after login

使用del语句定义函数:

>>> def hello(name):
    return 'Hello, '+name+'!'
>>> print hello('world')
Hello, world!
>>> print hello('Gumby')
Hello, Gumby!
Copy after login

编写一个fibnacci数列函数:

>>> def fibs(num):
     result=[0,1]
    for i in range(num-2):
       result.append(result[-2]+result[-1])
     return result
>>> fibs(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
>>> fibs(15)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
Copy after login

在函数内为参数赋值不会改变外部任何变量的值:

>>> def try_to_change(n):
    n='Mr.Gumby'
>>> name='Mrs.Entity'
>>> try_to_change(name)
>>> name
'Mrs.Entity'
Copy after login

由于字符串(以及元组和数字)是不可改变的,故做参数的时候也就不会改变,但是如果将可变的数据结构如列表用作参数的时候会发生什么:

>>> name='Mrs.Entity'
>>> try_to_change(name)
>>> name
'Mrs.Entity'
>>> def change(n):
     n[0]='Mr.Gumby'

>>> name=['Mrs.Entity','Mrs.Thing']
>>> change(name)
>>> name
['Mr.Gumby', 'Mrs.Thing']

Copy after login

参数发生了改变,这就是和前面例子的重要区别

以下不用函数再做一次:

>>> name=['Mrs.Entity','Mrs.Thing']
>>> n=name #再来一次,模拟传参行为
>>> n[0]='Mr.Gumby' #改变列表
>>> name
['Mr.Gumby', 'Mrs.Thing']
Copy after login

当2个变量同时引用一个列表的时候,它们的确是同时引用一个列表,想避免这种情况,可以复制一个列表的副本,当在序列中做切片的时候,返回的切片总是一个副本,所以复制了整个列表的切片,将会得到一个副本:

>>> names=['Mrs.Entity','Mrs.Thing']
>>> n=names[:]
>>> n is names
False
>>> n==names
True
Copy after login

此时改变n不会影响到names:

>>> n[0]='Mr.Gumby'
>>> n
['Mr.Gumby', 'Mrs.Thing']
>>> names
['Mrs.Entity', 'Mrs.Thing']
>>> change(names[:])
>>> names
['Mrs.Entity', 'Mrs.Thing']
Copy after login

关键字参数和默认值

参数的顺序可以通过给参数提供参数的名字(但是参数名和值一定要对应):

>>> def hello(greeting, name):
    print '%s,%s!'%(greeting, name)
>>> hello(greeting='hello',name='world!')
hello,world!!
Copy after login

关键字参数最厉害的地方在于可以在参数中给参数提供默认值:

>>> def hello_1(greeting='hello',name='world!'):
    print '%s,%s!'%(greeting,name)

>>> hello_1()
hello,world!!
>>> hello_1('Greetings')
Greetings,world!!
>>> hello_1('Greeting','universe')
Greeting,universe!

Copy after login

若想让greeting使用默认值:

>>> hello_1(name='Gumby')
hello,Gumby!
Copy after login

可以给函数提供任意多的参数,实现起来也不难:

>>> def print_params(*params):
     print params

>>> print_params('Testing')
('Testing',)
>>> print_params(1,2,3)
(1, 2, 3)

Copy after login

混合普通参数:

>>> def print_params_2(title,*params):
     print title
     print params

>>> print_params_2('params:',1,2,3)
params:
(1, 2, 3)
>>> print_params_2('Nothing:')
Nothing:
()

Copy after login

星号的意思就是“收集其余的位置参数”,如果不提供任何供收集的元素,params就是个空元组

但是不能处理关键字参数:

>>> print_params_2('Hmm...',something=42)
Traceback (most recent call last):
 File "<pyshell#112>", line 1, in <module>
  print_params_2('Hmm...',something=42)
TypeError: print_params_2() got an unexpected keyword argument 'something'
Copy after login

试试使用“**”:

>>> def print_params(**params):
     print params

>>> print_params(x=1,y=2,z=3)
{'y': 2, 'x': 1, 'z': 3}
>>> def parames(x,y,z=3,*pospar,**keypar):
     print x,y,z
     print pospar
     print keypar

>>> parames(1,2,3,5,6,7,foo=1,bar=2)
1 2 3
(5, 6, 7)
{'foo': 1, 'bar': 2}
>>> parames(1,2)
1 2 3
()
{}
>>> def print_params_3(**params):
     print params

>>> print_params_3(x=1,y=2,z=3)
{'y': 2, 'x': 1, 'z': 3}
>>> #返回的是字典而不是元组
>>> #组合‘#'与'##'
>>> def print_params_4(x,y,z=3,*pospar,**keypar):
     print x,y,z
     print pospar
     print keypar

>>> print_params_4(1,2,3,5,6,7,foo=1,bar=2)
1 2 3
(5, 6, 7)
{'foo': 1, 'bar': 2}
>>> print_params_4(1,2)
1 2 3
()
{}
Copy after login

相信本文所述对大家Python程序设计的学习有一定的借鉴价值。

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template