[摘要]本文详细介绍python中的函数,以及与之相关的参数和作用域的概念,并介绍递归的概念以及在程序中的应用。


函数定义

定义函数要用函数定义语句def。如下:

  1. def hello(name):
  2. return 'Hello,'+name+'!'
  3. pass
  4. print(hello('Gumy'))

在看一个例子,这个例子产生一个费波拉契数列。

  1. def fibs(num):
  2. result=[0,1]
  3. for i in range(num-2):
  4. result.append(result[-2]+result[-1])
  5. return result
  6. print(fibs(10))
  7. print(fibs(20))

return语句很重要,他是用来返回函数返回值的语句,函数可以返回0个,一个,或者更多的返回值。利用元组可以实现多个值的返回。(还记得元组吗?它的形式是:(。,。,。,。)!!!!,[。,。,。,。]序列!!!!{。:。,。:。,。:。}字典!!!!,‘lalalalalla’字符串!!!!)

文档化函数

如果想要给函数写文档,让其他使用该函数的人理解该函数的使用方法,可以加入注释。另外的一个方法是直接写上字符串。这类字符串在其他地方可能会特别有用,比如在def语句、模块、类语句后面等。这种字符串称为文档字符串

  1. def square(x):
  2. 'calculate the square of x.'
  3. return x*x
  4. help(square)

没有返回值的函数

没有返回值的函数不返回任何东西,这样的函数又叫过程。如下:

  1. def test():
  2. print('This is sun.')
  3. return
  4. print('This is moon.')
  5. x=test()
  6. print(x)
  7. #运行结果
  8. This is sun.
  9. None
  10. [Finished in 0.133s]

参数

函数的关键就是参数的传递,一方面是调用函数将参数传入,被调用函数接受参数的过程,另一方面是被调用函数将函数结果(返回值)返回给调用函数的过程。

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

在函数内部对参数作出修改,并不会影响外部该参量的值。如下:

  1. def exam(name):
  2. name='Mr.Gumy'
  3. return name
  4. name='Mr.Entity'
  5. aa=exam(name)
  6. print(aa)
  7. print(name)
  8. #运行结果
  9. Mr.Gumy
  10. Mr.Entity

参数储存在局部作用域里。

位置参数和关键字参数

Python中的参数主要有两类,一类常用的是位置参数。也就是说参数在参数列表中的位置很重要,调用时要按照位置排列。另外一种是关键字参数,可以不按照位置排列,这种方式在程序较大,参数比较多的情况下很有用。

位置参数的例子:

  1. def hello(na,nb):
  2. print('%s,%s'%(na,nb))
  3. hello('hello','word')
  4. hello('word','hello')
  5. # 结果:
  6. hello,word
  7. word,hello
  8. [Finished in 0.1s]

有些时候(尤其是参数较多的时候),参数的顺序很难记住。为了让事情更简单些,可以提供参数的名字。这类使用参数名提供的参数叫做关键字参数。在这种情况下调用函数时参数的位置和顺序不再重要,重要的是参数名和值一定要对应。

  1. def hello(na='Hello',nb='word'):
  2. print('%s,%s'%(na,nb))
  3. hello(na='hello',nb='word')
  4. hello(nb='word',na='hello')
  5. # 结果
  6. hello,word
  7. hello,word
  8. [Finished in 0.1s]

关键字参数的重要用途是:

  1. 提供了参数的默认值。
  2. 明晰了各参数的含义,是程序更易读懂。

位置参数和关键字参数可以联合使用:

  1. def hello(name,na='Hello',nb='good morning',nc='!'):
  2. print('%s,%s,%s,%s'%(na,name,nb,nc))
  3. hello('Bob',nb='You gays')
  4. hello('Bob',nb='word',na='hello')
  5. hello('Gumy')
  6. hello('Gumy','Hello','Good evening','>>>>>')
  7. # 结果
  8. Hello,Bob,You gays,!
  9. hello,Bob,word,!
  10. Hello,Gumy,good morning,!
  11. Hello,Gumy,Good evening,>>>>>
  12. [Finished in 0.1s]

任意数量参数

用户可以给函数提供任意多的参数。利用*或者**来完成参数的收集,就可以实现任意多参数的提供。其中*将参数收集起来变成元组来使用,对应于位置参数**将参数整理成为字典,对应于关键字参数

对于一般参数:

  1. def function(title,*params):
  2. print(title)
  3. print(params)
  4. function('params',1,2,3,4,5,6)
  5. # 结果
  6. params
  7. (1, 2, 3, 4, 5, 6)
  8. [Finished in 0.1s]

对于关键字参数:

  1. def function(**params):
  2. print(params)
  3. function(na=1,nb=2)
  4. # 结果
  5. {'na': 1, 'nb': 2}
  6. [Finished in 0.1s]

两者联合使用:

  1. def function(title,**params):
  2. print(title+':')
  3. print(params)
  4. function('title',na=1,nb=2)
  5. # 结果
  6. title:
  7. {'na': 1, 'nb': 2}
  8. [Finished in 0.1s]
  1. def function(x,y,z=1,*na,**nb):
  2. print(x,y,z)
  3. print(na)
  4. print(nb)
  5. function(1,2,3,4,5,6,7,8,9,num1=1,num2=2)
  6. print()
  7. function(1,2)
  8. # 结果
  9. 1 2 3
  10. (4, 5, 6, 7, 8, 9)
  11. {'num1': 1, 'num2': 2}
  12. 1 2 1
  13. ()
  14. {}
  15. [Finished in 0.1s]

作用域

每一个变量名都对应一个值,这种名-值对应类似于内置的字典,这种看不见的字典叫做命名空间,或者作用域,除了全局作用于之外,每个函数调用都会创建一个新的作用域。

函数内的变量被称为局部变量。局部变量只在当前环境中起作用,不会影响到当前环境之外的其他变量。参数的工作原理类似于局部变量,所以用全局变量的名字作为参数也是可行的。要注意变量屏蔽效应:当局部变量和全局变量同名时,如果直接应用该变量,系统会自动匹配局部变量的值,而把全局变量屏蔽掉。如果要在当前环境中引用全局变量,可以使用global语句:gilobals()[‘parameter’]获取。

函数可以嵌套,也即函数在定义的时候调用另外一个已有的函数,因此作用域也存在嵌套现象。函数还可以调用它自身,这叫做函数的递归调用。


递归

递归就是调用自身。直接给出几个经典的例子。

例1:阶乘的定义:

  1. def factorial(n):
  2. if n==1:
  3. return 1
  4. else:
  5. return n*factorial(n-1)
  6. print(factorial(10))
  7. # 结果
  8. 3628800
  9. [Finished in 0.1s]

例2:幂的计算:pow(x,n)

  1. def pow(x,n):
  2. if n==1:
  3. return x
  4. else:
  5. return x*pow(x,n-1)
  6. print(pow(3,3))
  7. # 结果
  8. 27
  9. [Finished in 0.2s]

例3:二分法查找

  1. def search(sequence,num,lower=0,upper=None):
  2. if upper is None:upper=len(sequence)-1
  3. if lower==upper:
  4. assert num==sequence[upper]
  5. return upper
  6. else:
  7. middle=(lower+upper)//2
  8. if num>sequence[middle]:
  9. return search(sequence,number,lower=middle+1,upper=upper)
  10. else:
  11. return search(sequence,number,lower=lower,upper=middle)
  12. seq=[34,67,8,123,4,100,95]
  13. seq.sort()
  14. print(seq)
  15. print(search(seq,34))
  16. print(search(seq,100))

Python学习笔记5(函数)的更多相关文章

  1. Python学习笔记之函数

    这篇文章介绍有关 Python 函数中一些常被大家忽略的知识点,帮助大家更全面的掌握 Python 中函数的使用技巧 1.函数文档 给函数添加注释,可以在 def 语句后面添加独立字符串,这样的注释被 ...

  2. 小甲鱼:Python学习笔记003_函数

    >>> # 函数>>> def myFirstFunction(params1,params2...): print("这是我的第一个函数!") ...

  3. Python学习笔记 - day6 - 函数

    函数 函数在编程语言中就是完成特定功能的一个词句组(代码块),这组语句可以作为一个单位使用,并且给它取一个名字.可以通过函数名在程序的不同地方多次执行(这叫函数的调用).函数在编程语言中有基本分为:预 ...

  4. Python学习笔记系列——函数

    今年下半年的计划主要是Python和Mysql了,公司不方便看书和视频,就照着廖雪峰的Python网站开始看了.以下纯为个人笔记记录,若是想系统学习的小伙伴还是看这里的好一些,毕竟系统.https:/ ...

  5. Python学习笔记(五)函数和代码复用

    函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Python提供了许多内建函数,比如print().同样,你也可以自己创建函数, ...

  6. python学习笔记(4)--函数

    1.函数 函数是指将一组语句的集合通过一个名字封装起来.要想执行这个函数,只需调用其函数名即可. 函数的特性: 1.减少重复代码 2.使程序变的课扩展 3.使程序变得易维护 语法定义: def pri ...

  7. Python学习笔记-Day3-python函数

    1.为什么要用函数? 提高代码重复利用率,减少代码冗余.封装模块化代码,便于调用 2.函数声明定义(注意:函数先声明后调用) 注意:函数的reture循环中的exit功能一样(函数不执行,终止) 函数 ...

  8. Python学习笔记11—函数

    建立第一个函数 /usr/bin/env Python #coding:utf-8 def add_function(a,b): c = a+b print c if __name__==" ...

  9. Python学习笔记7-把函数当参数传递、指定可变参数

    把函数当参数传递 # 函数参数传递 # 面向对象编程就是把对象传来传去 # 面向函数编程就是把函数传来传去 def mytest(num): return num * 2 # # 不光可以传递变量,还 ...

  10. Python学习笔记_week3_函数

    一.介绍 1.面向对象(华山派)--->类(独门秘籍)--->class(定义的关键字) 2.面向过程(少林派)--->过程--->def 3.函数式编程(逍遥派)---> ...

随机推荐

  1. django 数据库建表流程,与表结构

    目录 配置数据库 创建表结构 多表关连的设置 自创建关联表方法 自建表 和 ManyToManyField 联合使用 配置数据库 在Django项目的settings.py文件中,配置数据库连接信息: ...

  2. jmeter后置处理器之正则表达式

    一.基本用法——提取某个值 场景:提取某个值,保存成变量,供后面的接口使用 步骤: 1.运行脚本,从响应结果中查找要提取的值,找到左右边界. 例如要获取“patientInfoId”作为下一个请求的参 ...

  3. SpringBoot2.0 基础案例(06):引入JdbcTemplate,和多数据源配置

    一.JdbcTemplate对象 1.JdbcTemplate简介 在Spring Boot2.0框架下配置数据源和通过JdbcTemplate访问数据库的案例. SpringBoot对数据库的操作在 ...

  4. How to install your SSL Certificate to your Windows Server

    Installation: Open the ZIP file containing your certificate. Save the file named your_domain_name.ce ...

  5. Condition应用和源码分析

    1.Condition实现一个队列public class BoundedQueue<T> { public List<T> q; //这个列表用来存队列的元素 private ...

  6. python进阶06 常用问题库(2)datetime模块 base64

    python进阶06 常用问题库(2)datetime模块 base64 一.datetime模块(时间) 1.datetime.time() t=datetime.time(20,43,30,1) ...

  7. [Android]HttpClient和HttpURLConnection的区别

    转载:http://blog.csdn.net/guolin_blog/article/details/12452307 最近在研究Volley框架的源码,发现它在HTTP请求的使用上比较有意思,在A ...

  8. CodeForces - 796B-Find The Bone(模拟)

    Zane the wizard is going to perform a magic show shuffling the cups. There are n cups, numbered from ...

  9. Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises) D

    Country of Metropolia is holding Olympiad of Metrpolises soon. It mean that all jury members of the ...

  10. curl_setopt 注意

    最近碰到好多奇怪的BUG,今天就是一个例子. 我在用CURL调用麦考林的接口,在浏览器测试完全没问题,调用全都成功.但是用命令行执行PHP时,却一直不行,返回http code 302错误.百思不得其 ...