python——函数

1.函数的创建

  函数是可以调用的(可能带有参数,也可能无参),它执行某种行动并且返回一个值。一般来说,内建的callable函数可以用来判断函数是否可调用。

1 >>> import math
2 >>> x = 1
3 >>> y = math.sqrt
4 >>> callable(x)
5 False
6 >>> callable(y)
7 True

  注意:callable函数在python3.0中不可使用,需要使用表达式hasattr(func,_call_)代替。

  运用函数实现斐波那契数列

1 # 实现斐波那契数列函数
2 def fibs(num):
3     result = [0,1]
4     for i in range(num-2):
5         result.append(result[-2]+result[-1])
6     return result
7 # 掉用斐波那契函数
8 result = fibs(10)
9 print(result)

  1.文档化函数

  为了让其他人使用该函数的时候理解,可以加注释。还有另外一种方法是直接写上字符串。实例如下:

  

 1 def fibs(num):
 2     ‘该函数用于实现斐波那契数列‘
 3     result = [0,1]
 4     for i in range(num-2):
 5         result.append(result[-2]+result[-1])
 6     return result
 7 # 查看函数说明
 8 print(fibs.__doc__)
 9
10 -----
11 输出结果:
12 D:\Python27\python.exe D:/pythonwork/test01/function_1.py
13 该函数用于实现斐波那契数列

  2.并非真正函数的函数

  数学意义上的函数,总是在计算其参数后返回点什么。Python的有些函数却并非返回任何东西。在其他语言中,这类函数有可能有其他名字,比如过程。但是python的函数就是函数,基本在数学意义上不是。

  没有return语句,或者虽有return语句但是return后面没有跟任何值的函数不返回值:

1 >>> def test():
2 ...     print(‘hello python‘)
3 ...     # 这里的return语句只起到结束函数的作用
4 ...     return
5 ...     print(‘hi python‘)
6 ...
7 >>> test()
8 hello python
9 >>> x = test()  hello python >>> print(x)  None

  test函数其实返回了一个值“None”

  注意:千万不要被默认行为所迷惑。如果if语句内返回值,那么要确保其他分支也有其他返回值,这样一来当调用者期待一个序列的时候,就不会意外地返回None。

2.参数魔法

  1.简单区分形参和实参

  在python写在def语句中函数名后面的变量通常叫做函数的形参,而调用函数时提供的值是实参,或者称为参数。

  2.能改变参数吗?

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

1 >>> def try_to_change(n):
2 ...     n = ‘Mr.Gumby‘
3 ...
4 >>> name = ‘Mr.Entity‘
5 >>> try_to_change(name)
6 >>> name
7 ‘Mr.Entity‘
8 >>>

  为了方便理解,可以不用函数模拟一下

1 >>> name = ‘Mr.Entity‘
2 >>> n = name #这就话的作用基本上等于传参数
3 >>> n = ‘Mr.Gumby‘ #在函数内部完成的
4 >>> name
5 ‘Mr.Entity‘

  注意:参数存储在局部作用域(local scope)内。

  如果将可变的数据结构如列表用作参数的时候会发生什么:

1 >>> def change(n):
2 ...     n[0] = ‘Mr.Gumby‘
3 ...
4 >>> names = [‘Mr.G‘,‘Mr.Thing‘]
5 >>> change(names)
6 >>> names
7 [‘Mr.Gumby‘, ‘Mr.Thing‘]
8 >>>

  可以看到例子中参数发生了改变,解决这样的问题,可以先用切片的方法复制一个副本,然后对副本进行操作。这样就不影响原始数据了。

  3.为什么要修改参数

  使用函数改变数据结构(比如字典和列表)是一种将程序抽象化的好方法。

  假设需要编写一个存储名字并且能用名字、中间名或者姓查询联系人的程序,可以使用下面数据结构:

1 storage = {}
2 storage[‘frist‘] = {}
3 storage[‘middle‘] = {}
4 storage[‘last‘] = {}

  storage这个数据结构是带有3个键‘first‘、‘middle‘、‘last‘的字典。每个键下面都又存储一个字典。字典中,可以使用名字(名字、中间名或姓)作为键,插入联系人列表作为值。比如要把一个英文名字加入这个数据,可以按如下操作:

 1 me = ‘Magnus Lie Hetland‘
 2 storage[‘first‘][‘Magnus‘] = [me]
 3 storage[‘first‘][‘middle‘] = [me]
 4 storage[‘first‘][‘last‘] = [me]
 5 print(storage[‘first‘][‘Magnus‘])
 6 print(storage[‘first‘][‘middle‘])
 7 print(storage[‘first‘][‘last‘])
 8
 9 -------
10 结果如下:
11 D:\Python27\python.exe D:/pythonwork/test01/function_1.py
12 [‘Magnus Lie Hetland‘]
13 [‘Magnus Lie Hetland‘]
14 [‘Magnus Lie Hetland‘]

  将人名加到列表中的步骤有点枯燥无味,尤其是要加入很多人名的时候。代码如下:

 1 my_sister = ‘Anne Lie Hetland‘
 2 storage[‘first‘].setdefault(‘Anne‘, []).append(my_sister)
 3 storage[‘middle‘].setdefault(‘Lie‘, []).append(my_sister)
 4 storage[‘last‘].setdefault(‘Hetland‘, []).append(my_sister)
 5 print(storage[‘middle‘][‘Lie‘])
 6 print(storage[‘first‘][‘Anne‘])
 7
 8 ----------
 9 结果如下:
10 D:\Python27\python.exe D:/pythonwork/test01/function_1.py
11 [‘Magnus Lie Hetland‘, ‘Anne Lie Hetland‘]
12 [‘Anne Lie Hetland‘]

  如果写大程序来这样更新列表,那么很显然程序很快就会得臃肿不堪。

  怎么却解决呢,那么就要用到抽象了,抽象的要点就是隐藏更新时繁琐的细节,可以用函数来实现这个过程。

  实现一个添加查找用户名的程序,代码如下:

 1 # 创建初始化结构的函数
 2 def init(data):
 3     data[‘first‘] = {}
 4     data[‘middle‘] = {}
 5     data[‘last‘] = {}
 6
 7 # 创建查询函数
 8 def lookup(data, label, name):
 9     return data[label].get(name)
10
11 # 编写增加用户名的函数
12 def store(data, full_name):                # 使用参数data和full_name进入这个函数,这两个参数被设置为函数在外部获得的一些值。
13     names = full_name.split()              # 通过拆分full_name,得到一个叫做names的列表
14     if len(names) == 2:                    # 如果names的长度为2,那么插入一个字符串作为中间名
15         names.insert(1, ‘‘)
16     labels = (‘first‘, ‘middle‘, ‘last‘)
17     for label, name in zip(labels, names): # 使用zip函数联合表情和名字,对每一个(label,name)对,进行处理
18         people = lookup(data, label, name) # 调用查询函数,如果存在列表则追加,不存在则创建
19         if people:
20             people.append(full_name)
21         else:
22             data[label][name] = [full_name]
23
24 #####################################主函数#########################################
25 MyNames = {}
26 # 引用初始化结构函数
27 init(MyNames)
28 # 调用存储函数
29 store(MyNames, ‘Naguns Lie Hetland‘)
30 store(MyNames, ‘Anne Lie Hetland‘)
31 store(MyNames, ‘MyNames, Robin Hood‘)
32 # 调用查询函数
33 name = lookup(MyNames, ‘middle‘, ‘Lie‘)
34 print(name)

  4.如果参数是不可变的呢

  在python中:函数只能修改参数对象本身。但是如果你的参数不可变(比如数字),又该怎么办呢?

  不好意思,没有办法。

 将变量的数值增1的函数可以按如下方式来写 1 >>> def inc(x): return x+1
 2 ...
 3 >>> inc(10)
 4 11
 5 >>> x
 6 >>> foo = inc(10)
 7 >>> foo
 8 11 如果真的像改变参数,那么可以使用一点小技巧,将值放置在列表中:
 9 >>> def inc_2(x): x[0] = x[0] + 1
10 ...
11 >>> foo = inc_2(10)
12 >>> foo = inc_2([10])
13 >>> foo
14 >>> foo = [10]
15 >>> inc_2(foo)
16 >>> foo
17 [11]
18 >>>

  

  5.关键字参数和默认值

  目前为止我们所使用的参数都叫做位置参数,因为他们的位置很重要,事实上比他们的名字还重要。

  如以下例子:

 1 def hello_1(greeting, name):
 2     print(‘%s,%s!‘ % (greeting, name))
 3
 4
 5 def hello_2(name, greeting):
 6     print(‘%s,%s!‘ % (name, greeting))
 7
 8
 9 hello_1(‘hello‘, ‘python‘)
10
11 hello_2(‘hello‘, ‘python‘)
12
13 -----------------
14 结果:(两个代码显示的功能是一样的)
15 D:\Python27\python.exe D:/pythonwork/test01/function_2.py
16 hello,python!
17 hello,python!

  参数的顺序很难记住,为了让事情简单些,可以提供参数的名字:

def hello_1(greeting=‘hello‘, name=‘python‘):    print(‘%s,s%‘%(greeting, name))

# 这样一来顺序就完全没有影响了# 但参数值一定要对应

  这类使用参数名提供的参数叫做关键字参数。他的主要作用在于可以明确每个参数的作用。避免调用错参数。

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

1 >>> def hello_3(greeting=‘Hello‘, name=‘python‘):
2 ...     print(‘%s,%s!‘%(greeting, name))
3 ...
4 >>> hello_3()
5 Hello,python!

  

  6.收集参数

  以下写法可以给函数提供多个参数

  def print_params(*params):

    print(params)

  “*”的意义就是“收集其余的位置参数”。如果不提供任何供收集的元素,params就是个空元祖

  那么能不能处理关键字参数呢?见如下代码:

1 >>> print_params_2(‘Hmm...‘, something=42)
2 Traceback (most recent call last):
3   File "<stdin>", line 1, in <module>
4 NameError: name ‘print_params_2‘ is not defined
5 >>>

  很明显是不行的,所以我们需要采用另外一种方法来处理关键字参数的“收集”。这是就需要用到“**”

  事例如下:

1 >>> def print_params_3(**params):
2 ...     print(params)
3 ...
4 >>> print_params_3(x=1,y=2,z=3)
5 {‘x‘: 1, ‘z‘: 3, ‘y‘: 2}
6 >>>

  测试证明是可行的。反悔的是字典,而不是元组。

  那么放在一起是否可行呢?

>>> def print_params_4(x,y,z=3,*pospar, **keypar):
...     print(x,y,z)
...     print(pospar)
...     print(keypar)
...
>>> print_params_4(1,2,3,4,5,foo=1,bar=2)
1 2 3
(4, 5)
{‘foo‘: 1, ‘bar‘: 2}

  回到之前怎么实现多个名字同时存储的问题上。解决方案如下:

 1 # 编写增加用户名的函数
 2 def store(data, *full_names):                  # 使用“*full_names”收集参数,实现多个名字同时存储。
 3     for full_name in full_names:               # 使用参数data和full_name进入这个函数,这两个参数被设置为函数在外部获得的一些值。
 4         names = full_name.split()              # 通过拆分full_name,得到一个叫做names的列表
 5         if len(names) == 2:                    # 如果names的长度为2,那么插入一个字符串作为中间名
 6             names.insert(1, ‘‘)
 7         labels = (‘first‘, ‘middle‘, ‘last‘)
 8         for label, name in zip(labels, names):  # 使用zip函数联合表情和名字,对每一个(label,name)对,进行处理
 9             people = lookup(data, label, name)  # 调用查询函数,如果存在列表则追加,不存在则创建
10             if people:
11                 people.append(full_name)
12             else:
13                 data[label][name] = [full_name]

  

  7.参数收集的逆过程

1 >>> params = {‘name‘:‘Sir Robin‘,‘greeting‘:‘Well met‘}
2 >>> hello_3(**params)
3 Well met,Sir Robin!
4 >>>

  在定义或者调用函数时使用星号(或者双星号)仅传递元组或字典。

  星号只用在定义函数(允许使用不定数目的参数)或者调用(“分割”字典或者序列)时才有用。

  提示:

  使用拼接(splicing)操作符“传递”参数很有用,因为这样一来就不用关心参数的个数之类的问题了,例如:

1 def foo(x, y, z, m=0, n=0):
2     print(x, y, z, m, n)
3
4
5 def call_foo(*args, **kwds):
6     print(‘Calling foo!‘)
7     foo(*args, **kwds)

  

  8.使用参数例子:

 1 def story(**kwds):
 2     return ‘Once upon a time, there was a %(job)s called %(name)s.‘ % kwds
 3
 4
 5 def power(x, y, *others):
 6     # 如果为类型
 7     if others:
 8         print(‘Received redundant parameters:‘, others)
 9     return pow(x, y)
10
11
12 def interval(start, stop=None, step=1):  # start开始值, stop结束值, step步长
13     ‘Imitates range() for step >0 ‘      # 函数的用途
14     if stop is None:                     # 如果没有为stop提供直...
15         start, stop = 0, start           # 指定参数
16     result = []                          # 定义列表
17     i = start                            # 计算索引
18     while i < stop:                      # 直到检索到stop的索引
19         result.append(i)                 # 将索引添加到result内
20         i += step                        # 用step增加索引i
21     return result                        # 以列表的形式返回结果

小结:

  • 抽象:抽象是隐藏多余细节的艺术。定义处理细节的函数可以让程序更加抽象。
  • 函数定义:函数使用def语句定义。他们是由语句组成的块,可以从“外部世界”获取值(参数),也可以返回一个或者多个值作为运算结果。
  • 参数:函数从参数中得到需要的信息,也就是函数调用时设定的变量。Python中有两类参数:位置参数和关键字参数。参数在给定默认值时是可选的。

  

  

  

  

  

  

  

时间: 2024-10-12 03:14:50

python——函数的相关文章

浅析python函数

慢慢的开始进入状态啦,被明老师说我什么都不会后我觉得是该反思下自己这个学期的学习了,虽然我对实验没有很大的兴趣,但是既然名老师要求我开始做实验,我就跟着小丹师姐好好学学,用Tanger师兄的话来说就是:做实验有利于你理解生物信息学数据处理的原理,也许有一天,未来做生物信息的学弟学妹会看到这段话,就像我在码迷上看到free_mao的博文一样,生物信息还是基于生物的,生物原理必须要理解,不然和做计算机有什么区别呢?以前对书本的知识不够重视,语言的学习进度很缓慢,现在希望能分享一些学习心得体会给大家,

python函数

python函数学习 1. 概述: 函数是重用的程序段,用关键字def来定义,可以任意多次地运行这个语句块,被称为调用函数.Python提供了许多内建函数,比如print(),也可以自己创建函数,这被叫做用户自定义函数,函数能提高应用的模块性,和代码的重复利用率. 2.函数语法: 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号(). 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数. 函数的第一行语句可以选择性地使用文档字符串-用于存放函数说明. 函数内容以冒号起

Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数

一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(First-Class Object)呢? 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的. 1.函数身为一个对象,拥有对象模型的三个通用属性:id.类型.和值.

python 函数

函数的定义 函数最重要的目的是方便我们重复使用相同的一段程序. 将一些操作隶属于一个函数,以后你想实现相同的操作的时候,只用调用函数名就可以,而不需要重复敲所有的语句. 创建函数 def 函数名 (参数列表) 函数体 例如: def sum1(a,b): c = a + b return c e=1 f=2 print (sum1(e,f)) 首先def 是定义函数名 sum1是函数名 括号中的a, b是函数的参数,是对函数的输入.参数可以有多个,也可以完全没有(但括号要保留). c = a +

Python 五、Python函数

一.函数概述 1.函数的基础概念 函数是python为了代码最大程度地重用和最小化代码冗余而提供的基础程序结构. 函数是一种设计工具,它能让程序员将复杂的系统分解为可管理的部件 函数用于将相关功能打包并参数化 在python中可以创建4种函数: 全局函数:定义在模块中 局部函数:嵌套于其它函数中 lambda(匿名)函数:仅是一个表达式 方法:与特定数据类型关联的函数,并且只能与数据类型关联一起使用 函数和过程的联系:每个Python函数都有一个返回值,默认为None,也可以使用"return

六、Python函数

Python函数 一.函数 函数就是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取一个名字 可以通过函数名在程序的不同的地方多次执行(这通常叫做函数调用),却不需要在所有地方都重复编写这些语句 自定义函数和预定义函数 函数作用:降低编程的难度.代码重用 当我们自己定义一个函数时,通常使用def语句 def 函数名(参数列表): #可以没有参数 函数体 #!/usr/bin/python a = int(raw_input("please enter a number:&quo

Python 3.X 调用多线程C模块,并在C模块中回调python函数的示例

由于最近在做一个C++面向Python的API封装项目,因此需要用到C扩展Python的相关知识.在此进行简要的总结. 此篇示例分为三部分.第一部分展示了如何用C在Windows中进行多线程编程:第二部分将第一部分的示例进行扩展,展示了如何在python中调用多线程的C模块:第三部分扩展了第二部分,增加了在C模块的线程中回调python的演示. 本文所用的环境为:64位Win7 + python 3.4 x86 + vs2010 一.windows下的C语言多线程程序 windows下多线程编程

python函数及函数式编程

函数是对程序逻辑进行结构化或过程化的一种编程方法.函数与过程相比,两者都是可以被调用的实体,但是传统意义上的函数或者"黑盒",可能不带任何输入参数,经过一定的处理,最后向调用者传回返回值,而过程是简单.特殊.没有返回值的函数.其实,python的过程就是函数,因为在函数中如果没有显式return返回值的话,解释器会隐式地返回默认值None. 1.函数定义 def foo([argument-list]): "function_document_string" foo

Python函数信息

Python函数func的信息可以通过func.func_*和func.func_code来获取 一.先看看它们的应用吧: 1.获取原函数名称: 1 >>> def yes():pass 2 3 >>> a=yes 4 >>> a.func_name 5 'yes' 6 >>> 2.获取函数的flags[后面有用,先说这个] [python docs]:The following flag bits are defined for c

Python函数以及函数式编程

本文和大家分享的主要是python 函数及函数式编程相关内容,一起来看看吧,希望对大家 学习python有所帮助. 函数基本语法及特性 定义 数学函数定义: 一般的,在一个变化过程中,如果有两个变量 x 和 y ,并且对于 x 的每一 个确定的值, y都有唯一确定的值与其对应,那么我们就把 x 称为自变量,把 y 称为因变 量, y 是 x 的函数.自变量 x 的取值范围叫做这个函数的定义域. 但编程中的「函数」概念,与数学中的函数是有很  同的  函数是逻辑结构化和过程化的一种编程方法 函数的