python3入门之函数
相信大家学习过其他语言,懂得函数的作用。简单的说函数最好的作用就是可以使程序变得懒惰。python作为后起之秀,当然也会拥有函数这个有用的东西;
创建函数
使用def语句即可创建函数,如创建一个用来生成指定边界的斐波那契数列的函数:
 #!/usr/bin/env python3
    def fib(n):#使fibonacci数列到达n
        '打印fibonacci数列到n'
        a,b=0,1
        while a<n:
            print(a,end=' ')
            a,b=b,a+b
    fib(20)
0 1 1 2 3 5 8 13
关键字 def 引入了一个函数 定义 。在其后必须跟有函数名和包括形式参数的圆括号。函数体语句从下一行开始,必须是缩进的。
有关事项详解:
文档化函数
函数体的第一行语句可以是可选的字符串文本,这个字符串是函数的文档字符串,或者称为 docstring 。使用如下方式可以查看:
print(fib.__doc__)
打印fibonacci数列到n
参数的传递
函数 调用 会为函数局部变量生成一个新的符号表。 确切的说,所有函数中的变量赋值都是将值存储在局部符号表。 变量引用首先在局部符号表中查找,然后是包含函数的
局部符号表,然后是全局符号表,最后是内置名字表。 因此,全局变量不能在函数中直接赋值(除非用 global 语句命名),尽管他们可以被引用。
函数引用的实际参数在函数调用时引入局部符号表,因此,实参总是 传值调用 (这里的 值 总是一个对象 引用 ,而不是该对象的值)。 1 一个函数被另一个函数调用时,
一个新的局部符号表在调用过程中被创建。
函数名可以赋予其他名字
函数名可以重命名:
f=fib
f(100)
0 1 1 2 3 5 8 13 21 34 55 89
可能有人误会说fib()函数没有返回值,千万注意这里使用的是函数名,没有使用函数调用;事实上fib()确实返回了一个空值,未加return语句返回的时None;可以使用下方法查看:
print(fib(10))
0 1 1 2 3 5 8 None
深入理解python3函数定义
在python中,你也可以定义包含若干参数的函数,这里有三种可用的形式,可以混合使用:
默认参数值:
默认参数的定义方法如下:
def f(a,b,x=3,y=5):
     '测试默认参数'
    print(a,b,x,y)
上面的函数中参数a和b是必要参数,而参数x和y是可选参数,有自己的默认值;
这个函数可以通过几种不同的方式调用:
只给出必要参数: f(1,2)
给出一个可选的参数: f(1,2,4)
给出所有参数: f(1,2,4,6)
注意:
默认值只被赋值一次。这使得当默认值是可变对象时会有所不同,比如列表、字典或者大多数类的实例。例如,下面的函数在后续调用过程中会累积(前面)
传给它的参数:
def f(a, L=[]):
    L.append(a)
    return L
print(f(1))
print(f(2))
print(f(3))
#输出
[1]
[1, 2]
[1, 2, 3]
如果你不想让默认值在后续调用中累积,你可以像下面一样定义函数:
def f(a, L=None):
    if L is None:
        L = []
    L.append(a)
    return L
关键字参数:
有些时候函数的参数顺序是很难记忆的,为了让事情简单些,可以在调用时提供参数的名字:
def f(a,b,x=3,y=5):
     '测试关键字参数'
      print(a,b,x,y)
  #普通调用
   f(1,2)
  #关键字调用
  f(a=1,b=2,y=6)
  f(1,2,y=3)
#输出
1 2 3 5
1 2 3 6
1 2 3 3
注意:当使用了关键字后必须一直使用不然会报错:
比如下:
f(a=1,2)
SyntaxError: non-keyword arg after keyword arg
可变参数列表:
可以让函数调用可变个数的参数,这些参数被包装进一个元组或者字典。
可变参数定义方式:只需在参数前面加上×号,参数被包装在元祖中
 def print_params(title,*params):
      print(title)
      print(params)
可以和普通参数联合使用,×号收集的时其余的位置参数如: print_params("peace",23,170)     。如果不提供任何收集的元素,params时个空元祖:()  如:   print_params("pp")
同样还可以处理关键字参数,定义如下:只需在关键字参数前面加上××号,被包装在字典中;
def print_params(title,**params):
      print(title)
      print(params)
调用时必须注明关键字参数。可以这样调用:
print_params("peace",age=23,high=170)
print_params("pp")
参数列表的分拆
与可变参数刚好相反,
当你要传递的参数已经是一个列表,但要调用的函数却接受分开一个个的参数值。这时候你要把已有的列表拆开来
你可以在调用时加一个×操作符来自动把参数列表拆开:比如range():
>>> list(range(1,10))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> args=[1,10]
>>> list(range(*args))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
以同样的方式,可以使用 ** 操作符分拆关键字参数为字典:
Lambda 形 式
出于实际需要,有几种通常在函数式编程语言例如 Lisp 中出现的功能加入到了 Python。通过 lambda 关键字,可以创建短小的匿名函数。这里有一个函数返回它的两个参数的和: lambda a, b: a+b 。 Lambda 形式可以用于任何需要的函数对象。出于语法限制,它们只能有一个单独的表达式。语义上讲,它们只是普通函数定义中的一个语法技巧。类似于嵌套函数定义,lambda 形式可以从外部作用域引用变量:
def fun(n):
      '下面x是参数,x+n是返回值'
      return lambda x: x+n
 #f接收lambda返回的函数
 f=fun(10)
 print(f(0))
 print(f(10))
#输出:
10
20
相关链接:
python3入门之类
python3入门之函数
python3入门之循环
python3之if语句
python3入门之赋值语句介绍
python3入门之print,import,input介绍
python3入门之set
python3入门之字典
python3入门之字符串
python3入门之列表和元组
python3入门之软件安装
python3爬虫之入门和正则表达式
python3入门之函数的更多相关文章
- python3 入门 (三) 函数与lambda表达式、闭包
		函数 是组织好的.可重复使用的.用来实现单一或相关联功能的代码段. 函数代码块以def关键词开头,后接函数标识符名称和圆括号() 任何传入参数和自变量必须放在圆括号中间.圆括号之间可以用于定义参数 函 ... 
- python3入门之类
		在面向对象的语言中,类是最重要的一环,python自然拥有类这个机制.python的类机制,与C++,java的区别不是很大,类的大多数的重要特性都被沿用了,一样可以多态,抽象,封装: python3 ... 
- python3入门之集合set
		之前介绍python的数据结构时,没有介绍set(集合)现在在这里稍微介绍下: set原理 Python 还 包 含 了 一 个 数 据 类 型-- set ( 集 合 ) . 集 合 是 一 个 无 ... 
- python3入门之赋值语句介绍
		获得更多资料欢迎进入我的网站或者 csdn或者博客园 本节主要介绍赋值语句,以及几种特殊的赋值.下面附有之前的文章: python3入门之print,import,input介绍 python入门之字 ... 
- python3入门之print,import,input介绍
		本节主要介绍print,import和input,t函数,包括他们在python2.7和python3 的区别以及用法.下面附有之前的文章:  python3的print函数的变化 python3之 ... 
- python3入门之字典
		获得更多资料欢迎进入我的网站或者 csdn或者博客园 本节主要介绍字典,字典也成映射,时python中唯一内建的映射类型.更多详细请点击readmore.下面附有之前的文章: python入门之字符串 ... 
- python3入门之字符串
		获得更多资料欢迎进入我的网站或者 csdn或者博客园 经过前面的介绍相信大家也对python有了一个初步的了解:本节主要介绍字符串,不管学习什么编语言字符串一定在其中扮演着重要的地位.本节主要讲解,字 ... 
- python3入门之列表和元组
		获得更多资料欢迎进入我的网站或者 csdn或者博客园 前面一张主要学习了Python的安装,以及第一个程序helloword的编写,以及简单的输入和输出函数,这章主要介绍序列,列表,元组 序列 这章 ... 
- Python3入门之软件安装
		获得更多资料欢迎进入我的网站或者 csdn或者博客园 最近将我的Python笔记整理下,希望能对他人有所帮助,这是第一课,安装入门篇: windows下安装Python 1.下载,从这里下载:[下载链 ... 
随机推荐
- Python_12-线程编程
			1.1 Python中的线程使用1.1.1 函数式1.2 创建threading.Thread的子类来包装一个线程对象1.2.1 threading.Thread类的使用1.3 线程 ... 
- 【HDU4967】Handling the Past
			题意 模拟栈操作.有三种操作push,pop,peak分别代表从栈顶压入元素,删除栈顶元素,查询栈顶元素.但是,每个操作会给出一个时间戳,要求操作必须要按照时间戳来进行.但是对于每个peak必须马上给 ... 
- 86. Partition List (List)
			Given a linked list and a value x, partition it such that all nodes less than x come before nodes gr ... 
- Hibernate核心API
			------------------------siwuxie095 (一)Configuration 1.一般情况 或: 加载核心配置文件:在 src 下找到名称为 Hibernate.cfg.xm ... 
- python解析pcap文件中的http数据包
			使用scapy.scapy_http就可以方便的对pcap包中的http数据包进行解析 scapy_http可以在https://github.com/invernizzi/scapy-http下载, ... 
- 关于jdk7中 使用Collections的排序方法时报Comparison method violates its general contract!异常
			参考: Comparison method violates its general contract Comparison method violates its general contract! ... 
- Red Hat 6.5 Samba服务器的搭建(登录访问)
			搭建Samba服务器是为了实现Linux共享目录之后,在Windows可以直接访问该共享目录. 现在介绍如何在红帽6.5系统中搭建Samba服务. 搭建Samba服务之前,yum源必须配置好,本地源和 ... 
- mybatis思维导图(一)
			写在前面 与hibernate相比,我无疑更喜欢mybatis,就因为我觉得它真的好用,哈哈.它简单上手和掌握:sql语句和代码分开,方便统一管理和优化:当然缺点也有:sql工作量很大,尤其是字段多. ... 
- ceph中查看一个rbd的image的真实存储位置
			1.新建一个image存储 rbd create hzb-mysql --size 2048 2.查看hzb-mysql的所有对象 一个rbd image实际上包含了多个对象(默认情况下是image_ ... 
- 自己(转)JAVA中toString方法的作用
			JAVA中toString方法的作用 因为它是Object里面已经有了的方法,而所有类都是继承Object,所以“所有对象都有这个方法”. 它通常只是为了方便输出,比如System.out.print ... 
