概念

一段代码,集中到一起,起一个名字,下一次可以使用这个名字调用这个代码块,就是函数的功能

作用:

  • 方便代码的重用
  • 分解任务,简化程序逻辑
  • 使代码更加模块化

函数的分类

  • 内建函数
  • 第三方函数
  • 自定义函数

函数定义

简单定义

def 函数名():
函数体代码
函数名()  # 函数调用

参数

固定个数的参数

def xxx(参数1, 参数2, ...):
......
# 在函数体,直接以变量的方式使用传过来的参数

这种方式,调用的时候,形参与实参一一对应

关键字参数

固定个数的参数不止可以按位置一一对应地去调用传参,也可以按参数名进行指定,这种方式不必按照原来的顺序

def xxx(name1, name2, ...):
......

调用:

xxx(name2=..., name1=...)

不定长参数

将除了按位置匹配以外的参数,收集到一起

收集为元组

def xx(...., *args):
.....

函数调用时,多余的参数,会组成元组赋值给args

收集为字典

def xx(...., **kwargs):
......

可以将多余的关键字参数收集为字典,函数内可以直接当做字典使用

参数的拆包和装包

装包:把传递的参数,包装起来

拆包:把包装起来的参数,再次拆分为单独的个体

缺省参数

有些参数可以设置默认值,也就是调用的时候如果不传值,则会使用设置的默认值

注意:默认值参数需要写在最后面

返回值

函数可以返回任意对象

return xxx

注意:

  • return后的代码不会被执行
  • return只会被执行一次

函数描述

在函数体的最前面,添加三引号的注释

可以使用 help(函数名) 查看注释的内容

偏函数

当我们写一个参数比较多的函数时,如果有些函数,大部分场景下都是某一个默认值,那么为了简化使用,就可以创建一个新函数,指定我们要使用的函数的某个参数,为某个固定的值,这个新的函数就是 “偏函数”

可以自己手动创建,但是python也为我们提供了专门的工具:

import functools

functools.partial(函数名, 特定参数=偏爱值) # 返回生成好的偏函数

高阶函数

当一个函数A的某个参数是另一个函数时,则把这个函数A称为是高阶函数

返回函数

函数也可以作为返回值。。。

匿名函数

匿名函数也称为 lambda函数,也就是没有名字的函数

语法:lambda 参数表: 返回值

闭包的概念

在函数嵌套的前提下,内层函数引用了外层函数的变量(包括参数)

外层函数,又把内存函数当做返回值进行返回

这个内层函数+所引用的外层变量,称为闭包

常用场景:外层函数,根据不同的参数,来生成不同作用功能的函数

注意:

  • 闭包中,如果要修改引用的外部变量

    • 需要使用 nolocal 变量名 声明
    • 否则当做闭包内,新定义的变量
  • 当闭包内引用了一个后期会发生变化的变量时,一定要注意
    • 当函数被调用的时候,才会真正确定所使用的的值,在此之前,都是以普通的变量标识而存在

装饰器

装饰器的概念

在函数名以及函数体不改变的前提下,给函数附件一些额外的代码

def zsq(func):
def inner():
...
func()
...
return inner @zsq
def xxx():
...... # @zsq 就相当于 xxx = xsq(xxx)

装饰器的叠加

从上往下装饰,从下往上执行

对有参函数进行装饰

无论什么场景,保证函数调用参数一致

为了通用,可以使用不定长参数,结合拆包操作进行处理

def zsq(func):
def inner(*args, **kwargs):
...
func(*args, **kwargs)
...
return inner

对有返回值的函数进行装饰

def zsq(func):
def inner(*args, **kwargs):
...
ret = func(*args, **kwargs)
...
return ret return inner

带有参数的装饰器

通过 @装饰器(参数) 的方式,调用这个函数,并传递参数;并把返回值,再次当做装饰器使用

先计算 @ 后面的内容,把这个内容当做装饰器

生成器

是一个特殊的迭代器(迭代器的抽象层级更高)

所以,拥有迭代器的特性:

  • 惰性计算数据,节省内存
  • 能够记录状态,并通过next()函数,访问下一个状态
  • 具备可迭代特性

但是,如果自己打造一个迭代器,比较复杂

生成器创建方式

  • 生成器表达式:把列表推导式的 []改为 ()
  • 生成器函数:使用 yield 语句,函数的执行结果就是一个生成器

产生数据的方式

生成器具备可迭代特性

next() 函数 等价于 生成器.__next__()

for in

send 方法

send方法有一个参数,指的是上一次被挂起的yield语句的返回值

相比于 __next__(),可以额外的给yield语句传值

注意第一次调用

关闭生成器

g.close()

关闭后如果继续调用,会抛出StopIteration异常提示

注意

如果遇到return,生成器会直接终止

生成器只会遍历一次

递归

在函数A内部,直接或者间接调用函数A

函数作用域

变量的作用域:

  • 变量的作用范围:可操作范围
  • Python是静态作用域,也就是说在Python中,变量的作用域源于它在代码中的位置;在不同的位置,可能有不同的命名空间
  • 命名空间:
    • 是作用域的体现形式
    • 不同的具体的操作范围
  • Python-LEGB
    • L:Local:

      • 函数内的命名空间,
      • 作用范围:当前整个函数体范围
    • E:Enclosing function locals:
      • 外部嵌套函数的命名空间
      • 作用范围:闭包函数
    • G:Global
      • 全局命名空间
      • 作用范围:当前模块(文件)
    • B:Builtin
      • 内建模块命名空间
      • 作用范围:所有模块(文件)
    • 注意:
      • Python中没有块级作用域
      • 块级作用域:代码块中,比如if、while、for后面的代码块
    • LEGB规则:按照 L、E、G、B的顺序进行查找

常见的变量类型:

  • 局部变量

    • 在一个函数内部定义的变量
    • 作用域为函数内部
    • 查看局部变量 locals()
  • 全局变量
    • 在函数外部,文件最外层定义的变量
    • 作用域为整个文件内部
    • 查看全局变量 globals()
  • 注意点
    • 访问原则:从内到外
    • 结构规范:
      • 全局变量
      • 函数定义:使用、修改
      • 后续代码
    • 全局变量和局部变量重名
      • 获取:就近原则
      • 修改:global声明
    • 命名

Python:函数基础的更多相关文章

  1. 《转》Python学习(17)-python函数基础部分

    http://www.cnblogs.com/BeginMan/p/3171977.html 一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/arch ...

  2. Python 函数基础、有序集合、文件操作(三)

    一.set 特点: set是一个无序且不重复的元素集合访问速度快:天生解决元素重复问题 方法: 初始化 >>> s1 = set()>>> print(type(s ...

  3. python函数基础学习

    函数的定义与调用: def 函数名(参数1,参数2): ‘’’函数注释’’’ print(‘函数体’) return 返回值 定  义:def关键字开关,空格之后接函数名和圆括号,最后冒号结尾 def ...

  4. 10分钟学会Python函数基础知识

    看完本文大概需要8分钟,看完后,仔细看下代码,认真回一下,函数基本知识就OK了.最好还是把代码敲一下. 一.函数基础 简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运 ...

  5. Python函数基础和函数参数

    函数的定义和函数的调用 return的作用 三种参数的定义 常用的内置函数 len() 函数基础 函数的定义 def 函数名(参数): pass return 表达式 pass在这里表示什么都没有,不 ...

  6. python函数基础

    一.基础 函数的定义 def 函数名(参数): ... 函数体 ... 返回值 #如果函数执行完毕也没有return语句时,自动return None. 空函数 如果想定义一个什么事也不做的空函数,可 ...

  7. python 函数基础介绍

    函数是对程序逻辑进行结构化或过程化的一种编程方法.能将整块代码巧妙地隔离成易于管理的小块,把重复代码放在函数中而不是进行大量的拷贝. 一.函数创建 def 函数创建格式如下: def function ...

  8. Python函数基础学习(定义、函数参数、递归函数)

    1.本程序是测试函数的基础.函数的参数.递归函数的测试. 函数的参数有: 必选参数.默认参数.可变参数.命名关键字参数和关键字参数 #!/usr/bin/python # -*- coding: ut ...

  9. python函数基础 与文件操作

    函数的定义 函数是通过赋值传递的,参数通过赋值传递给函数.def语句将创建一个函数对象并将其赋值给一个变量名,def语句的一般格式如下: def function_name(arg1,arg2[,.. ...

  10. 4.python函数基础

    一.函数 1.函数简介 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但 ...

随机推荐

  1. 微信h5游戏如何在微信中做好域名防封 防屏蔽的 工作

    最近微信开始大封杀,不知道原因是什么,可能是因为违规网站太多了吧,很多网站都被错杀了,下面我们聊一下怎样才能避免域名被封杀呢. 在各种不同的域名当中,能够做出了更适合的选择,这些对于大家域名防封_域名 ...

  2. Android开发实战——记账本(6)

    开发日志——(6) 今天将app签名打包,并部署在了真机上.真机上的截图: 运行成功:

  3. FTP服务:使用 vsftpd 服务传输文件

    1.文件传输协议 今天的互联网是由几千万台个人计算机.工作站.服务器.小型机.大型 机.巨型机等具有不同型号.不同架构的物理设备共同组成的,而且即便是个人计算机,也 可能会装有 Windows.Lin ...

  4. 每天进步一点点------创建Microblaze软核(三)

    第七步 进入SDK开发环境编译完成后弹出如下对话框,选择SDK的工作目录.在MicroblazeTutor中创建一个Workspace文件夹,并选择该文件夹为SDK的工作目录.进入SDK主界面.第八步 ...

  5. 【网易官方】极客战记(codecombat)攻略-地牢-Kithmaze 二度历险

    关卡连接: https://codecombat.163.com/play/level/the-second-kithmaze 很多人试过,但只有少数人能穿过此迷宫. 简介: 记住,你只需 一个 wh ...

  6. bugku web4

    打开打开,刚刚有个sb问我借lol号玩,浪费时间 继续干正事 随便输入后,提示     再好好看看... 出题人语文肯定不好 ,,,应该是这个 ‘再’ 吧 那我们查看源码 将那么明显的两行   进行 ...

  7. 移动端适配rem为单位的rem.js及个别设备设置了大字体模式,导致页面变形的处理方式

    这段时间内,涉及到的都是移动端开发,说到移动端开发,我们就会思考到,目前分辨率的问题,如果用px为单位的话,在不同移动设备和不同分辨率下,页面的效果可能会有所不同,甚至导致页面变形.所以在次我们就用到 ...

  8. React源码解析之React.Children.map()(五)

    一,React.Children是什么? 是为了处理this.props.children(this.props.children表示所有组件的子节点)这个属性提供的工具,是顶层的api之一 二,Re ...

  9. 题解【Codeforces1186A】 Vus the Cossack and a Contest

    这题是入门难度的题目吧-- 根据题意可以得出,只有当\(m\)和\(k\)都大于等于\(n\)时,\(Vus\)才可以实现他的计划. 因此,我们不难得出以下\(AC\)代码: #include < ...

  10. C语言 time、rand、srand

    C语言 time.rand.srand #include <time.h> time_t time(time_t *t); 功能:获取当前系统时间 参数:常设置为NULL 返回值:当前系统 ...