一、函数定义

  1. def name( parameters): #没有参数括号内可以为空
  2. "函数描述" #其实就是注释
  3. <代码块>
  4. return [expression] #没有返回值可以不加[]内容,也可以省略return

def是定义函数的关键字,name是函数名,parameters是形参

函数描述可以省略,但建议要有

expression是返回值,可以没有返回值,也可以没有retrun。

函数在return处结束。

二、传参过程

这里需要了解几个名词:位置参数、关键参数、默认参数

1.位置参数:按照函数形式参数的顺序传递参数

  1. def func(x,y):
  2. print("x={0} y={1}".format(x,y))
  3.  
  4. func(3,4)
  5. func(4,3)
  6.  
  7. #输出:
  8. x=3 y=4
  9. x=4 y=3

可以发现,位置参数的使用相当于C语言当中的函数调用方式。

2.关键参数:指的是在传递参数时,不必考虑形式参数的具体先后顺序,以“形式参数=实际参数”的形式传参。

  1. def func(x,y):
  2. print("x={0} y={1}".format(x,y))
  3.  
  4. func(y=3,x=4)
  5.  
  6. #输出结果:
  7. x=4 y=3

3.默认参数:如果函数有默认参数,允许调用函数时不对默认参数传参(这时形参为默认值)

  1. def text2(x,y=2):#y为默认参数,非必须传递
  2. print(xy)
  3.  
  4. text2(1) #可以这样调用
  5. text2(1,3) #也可以这样调用
  6.  
  7. #输出结果:
  8. 1 2
  9. 1 3

4.参数组

如何向函数传递一个元组呢?

需要参数组

  1. def text3(*args):
  2. print(args)
  3.  
  4. text3(1,2,3) #当使用参数组时,调用函数可以不传参
  5. #输出:
  6. 123

形参中*args是参数组,可以接收数量不固定的参数,也可以接收0个参数,并将这些参数组成一个元组在函数中使用。

参数组可以在参数个数不确定的情况下使用。

5.字典的传递

  1. def text5(**kwargs):#向函数传递字典
  2. print(kwargs)
  3. text5() #调用函数时可以不传参
  4. text5(name="liuwei",sex="man",index=3) #标准的传参传字典过程
  5.  
  6. #输出结果:
  7. {“name”:"liuwei","sex":"man","index":3} #3是int型

这种传参方式很容易和关键参数混淆。

6.多种类型参数传递和优先级问题

  1. def text6(a,b=2,*args,**kwargs):
  2. print(a)
  3. print(b)
  4. print(args)
  5. print(kwargs)
  6. text6("woo",3,sex="m",hobby="aa")
  7.  
  8. #输出结果:
  9. woo
  10. 3
  11. ()
  12. {'sex': 'm', 'hobby': 'aa'}

在定义函数时,形参应当遵循 普通参数-->默认参数-->参数组-->字典参数 的顺序

在调用函数时,实参应当遵循 位置参数-->关键参数-->参数组-->字典参数 的顺序

这样做为的是避免混淆。

7.如何传递列表

(1)位置参数

  1. def func(names):
  2. print(names)
  3. names[1] = 'jujinyi'
  4.  
  5. names = ['aaron','jim']
  6. func(names)
  7. print(names)
  8.  
  9. #输出:
  10. ['aaron', 'jim']
  11. ['aaron', 'jujinyi']

永久性改变了列表的值。如果想要对列表附件操作,可以用切片的方式

  1. def func(names):
  2. print(names)
  3. names[1] = 'jujinyi'
  4.  
  5. names = ['aaron','jim']
  6. func(names)
  7. print(names)
  8.  
  9. #输出:
  10. ['aaron', 'jim']
  11. ['aaron', 'jim']

(2)关键参数

本质上和位置参数是一样的,没有什么区别

(3)元组传递

将传进去的元组使用list函数

  1. def func(*toppings):
  2. toppings = list(toppings)
  3. print(toppings)
  4.  
  5. func('mushrooms','extra','cheese')
  6. func('mushrooms','extra')
  7.  
  8. #输出:
  9. ['mushrooms', 'extra', 'cheese']
  10. ['mushrooms', 'extra']

三、返回值

可以返回任何类型。基本数据类型(字符、整型等),列表(元组),字典,集合,甚至函数名也可以被返回

如果返回多个值,所有的返回值会被封装成一个元组返回

四、局部变量和全局变量

1.定义

全局变量是定义在函数体外面的变量,局部变量是定义在函数体内的变量

全局变量的作用域和生命周期从被定义开始直到程序结束,而局部变量则是从被定义到所在的函数结束。

2.全局变量的使用

全局变量当然可以在函数体外随意使用,在函数体内还会一样吗?

  1. a=6
  2. c=[1,2,3,4,5]
  3. def text():
  4. a=5
  5. b=10
  6. c[1]=0
  7. print("a={0},b={1},c={2}".format(a,b,c))
  8.  
  9. text()
  10. print("a={0},b={1},c={2}".format(a,b,c))

运行结果报错,问题出在最后一行:NameError: name 'b' is not defined。因为变量b是局部变量,只存在于函数内,在函数外已经不存在了。

改一下:

  1. print("a={0},c={1}".format(a,c))
  2.  
  3. #输出结果:
  4. a=5,b=10,c=[1, 0, 3, 4, 5]
  5. a=6,c=[1, 0, 3, 4, 5]

发现了什么问题?a和c同为全局变量,都在函数内经过了修改,但是c被永久性的修改,a只是在函数内被修改,出来后被复原了。

这是因为列表c在函数内外都是原件,而整型a在函数内修改,修改的是函数拷贝的临时变量,保证了全局变量的安全性。

因此,可以用函数直接对列表、字典、集合等复杂类型的全局变量进行操作,但是无法在函数内对基本类型(如int,str,float等)的全局变量进行修改。

3.如何在函数内修改基本类型的全局变量?

Python提供了global关键字来进行声明

  1. a=6
  2. def text():
  3. global a #声明要在函数内修改全局变量
  4. a=10
  5. print(a)
  6.  
  7. text()
  8. print(a)
  9.  
  10. #运行结果:
  11. 10
  12. 10

这样,全局变量就被修改了。

虽然有这种方法,但是如果没有这种强烈需求的话,尽量不要这么做。

五、高阶函数和嵌套函数

1.以下两个条件满足其一就可称之为高阶函数:

(1)把函数名当做实参传递给另一个函数

(2)返回值中包含函数名

2.函数可以嵌套,即函数体内可以定义函数

六、递归

定义:如果在函数内部可以调用自己,那么就称之为递归函数

递归需要满足的特性:

1.必须有一个明确的结束条件 (python内有预定的最大递归层数:999,程序的保护机制)
2.每深入一层时,问题的规模应该减小
3.递归的效率不高,递归层次过多容易导致栈溢出

初学Python——函数的更多相关文章

  1. 初学 Python(十三)——匿名函数

    初学 Python(十三)--匿名函数 初学 Python,主要整理一些学习到的知识点,这次是匿名函数. # -*- coding:utf-8 -*- #关键字lambda定义的函数都是匿名函数 #做 ...

  2. 初学 Python(十二)——高阶函数

    初学 Python(十二)--高阶函数 初学 Python,主要整理一些学习到的知识点,这次是高阶函数. #-*- coding:utf-8 -*- ''''' 话说高阶函数: 能用函数作为参数的函数 ...

  3. 初学Python(九)——函数

    初学Python(九)--函数 初学Python,主要整理一些学习到的知识点,这次是函数. 函数定义: # -*- coding:utf-8 -*- #函数的定义 def my_function(x) ...

  4. 初学 Python(十五)——装饰器

    初学 Python(十五)--装饰器 初学 Python,主要整理一些学习到的知识点,这次是生成器. #-*- coding:utf-8 -*- import functools def curren ...

  5. 初学 Python(十四)——生成器

    初学 Python(十四)--生成器 初学 Python,主要整理一些学习到的知识点,这次是生成器. # -*- coding:utf-8 -*- ''''' 生成式的作用: 减少内存占有,不用一次性 ...

  6. Python函数可变参数*args及**kwargs详解

    初学Python的同学们看到代码中类似func(*args, **kwargs)这样的函数参数定义时,经常感到一头雾水. 下面通过一个简单的例子来详细解释下Python函数可变参数*args及**kw ...

  7. 初学python之感悟

    python的强大有目共睹,现将初学python,觉得其中比较重要的知识罗列如下: 类似于数组的东西:列表.元组.集合.字符串以及字典,这几个东西充分体现了python的强大和逆天. 列表: x=[1 ...

  8. 初学Python常见异常错误,总有一处你会遇到!

    初学Python常见错误 忘记写冒号 误用= 错误 缩紧 变量没有定义 中英文输入法导致的错误 不同数据类型的拼接 索引位置问题 使用字典中不存在的键 忘了括号 漏传参数 缺失依赖库 使用了pytho ...

  9. 初学Python写二进制文件

    初学Python写二进制文件 把一个图片的16进制数据保存到一个txt文本,从这个txt文本读出并保存为二进制文件jpg图片文件.说明:图片读出的0xff粘贴ff到文本中,读出时是字符串的”ff”. ...

随机推荐

  1. JS实现数组去重方法整理

    前言 我们先来看下面的例子,当然来源与网络,地址<删除数组中多个不连续的数组元素的正确姿势> 我们现在将数组中所有的‘ a’ 元素删除: var arr = ['a', 'a', 'b', ...

  2. 【20190219】CSS-知识点整理:float、em、浏览器的渲染过程

    一.float与absolute 昨天看到一篇博客总结CSS中的一些关键知识点,里面对float元素进行了比较深入的解析,才发现我之前对float的理解不到位.float实际上最初的目的是为了实现图片 ...

  3. easyUI按钮图表对照大全

    easyUI图标与对照类的对应关系:

  4. 浅谈运维中的安全问题-FTP篇

    写这一系列文章的动因很简单,在年前最后一个项目的时候在客户现场做了的几个安全加固.由于时间问题,很多东西就拿来主义没经过思考直接更改了,并未细细品味其中的原理和方法,所以特地搭建实验环境,分析下其中的 ...

  5. 开发Spring过程中几个常见异常(一)

    异常一:java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory 原因:未导入有关日志管理的jar包或者未添加到路径. ...

  6. WangleEditor3提交数据(servlet-jsp)

    用servlet提交 WangEditor3编辑的内容,找了很多资料没发现,大多用的框架,今天终于解决了,记录一下. WangEditor3不支持放在textarea中,servlet是无法直接获取到 ...

  7. Thrift的C++服务端(线程池和非阻塞)模式

    非阻塞模式 #include "RpcServiceHandler.h" #include <thrift/concurrency/ThreadManager.h> # ...

  8. c++预声明类引发的无法解析外部符号问题

    在VisualStudio下开发C++程序常遇到链接问题就是:LNK2019 无法解析外部符号. 这个问题一般我们认为是没有将引用的代码链接到当前项目造成,也有例外,就是下面我要说的预声明类导致的. ...

  9. TypeScript的概要和简介

    安装 Typescript的基本介绍可以自行百度 centos虚拟机中可以完整的体验, virtualbox安装开发版本,选择开发工具项,否则增强功能无法安装[提示kernel 头文件缺失,yum安装 ...

  10. python 画个小猪佩奇

    不知道大家小时候有没有学习过logo语言,就是操纵一只小王八,来画各种图案.博主小学微机课就学习了这个,最近发现python的turtle包就是logo语言,所以画个小猪佩奇和大家分享. 代码来自知乎 ...