Python:函数基础
概念
一段代码,集中到一起,起一个名字,下一次可以使用这个名字调用这个代码块,就是函数的功能
作用:
- 方便代码的重用
- 分解任务,简化程序逻辑
- 使代码更加模块化
函数的分类
- 内建函数
- 第三方函数
- 自定义函数
函数定义
简单定义
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的顺序进行查找
- L:Local:
常见的变量类型:
- 局部变量
- 在一个函数内部定义的变量
- 作用域为函数内部
- 查看局部变量 locals()
- 全局变量
- 在函数外部,文件最外层定义的变量
- 作用域为整个文件内部
- 查看全局变量 globals()
- 注意点
- 访问原则:从内到外
- 结构规范:
- 全局变量
- 函数定义:使用、修改
- 后续代码
- 全局变量和局部变量重名
- 获取:就近原则
- 修改:global声明
- 命名
Python:函数基础的更多相关文章
- 《转》Python学习(17)-python函数基础部分
http://www.cnblogs.com/BeginMan/p/3171977.html 一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/arch ...
- Python 函数基础、有序集合、文件操作(三)
一.set 特点: set是一个无序且不重复的元素集合访问速度快:天生解决元素重复问题 方法: 初始化 >>> s1 = set()>>> print(type(s ...
- python函数基础学习
函数的定义与调用: def 函数名(参数1,参数2): ‘’’函数注释’’’ print(‘函数体’) return 返回值 定 义:def关键字开关,空格之后接函数名和圆括号,最后冒号结尾 def ...
- 10分钟学会Python函数基础知识
看完本文大概需要8分钟,看完后,仔细看下代码,认真回一下,函数基本知识就OK了.最好还是把代码敲一下. 一.函数基础 简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运 ...
- Python函数基础和函数参数
函数的定义和函数的调用 return的作用 三种参数的定义 常用的内置函数 len() 函数基础 函数的定义 def 函数名(参数): pass return 表达式 pass在这里表示什么都没有,不 ...
- python函数基础
一.基础 函数的定义 def 函数名(参数): ... 函数体 ... 返回值 #如果函数执行完毕也没有return语句时,自动return None. 空函数 如果想定义一个什么事也不做的空函数,可 ...
- python 函数基础介绍
函数是对程序逻辑进行结构化或过程化的一种编程方法.能将整块代码巧妙地隔离成易于管理的小块,把重复代码放在函数中而不是进行大量的拷贝. 一.函数创建 def 函数创建格式如下: def function ...
- Python函数基础学习(定义、函数参数、递归函数)
1.本程序是测试函数的基础.函数的参数.递归函数的测试. 函数的参数有: 必选参数.默认参数.可变参数.命名关键字参数和关键字参数 #!/usr/bin/python # -*- coding: ut ...
- python函数基础 与文件操作
函数的定义 函数是通过赋值传递的,参数通过赋值传递给函数.def语句将创建一个函数对象并将其赋值给一个变量名,def语句的一般格式如下: def function_name(arg1,arg2[,.. ...
- 4.python函数基础
一.函数 1.函数简介 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但 ...
随机推荐
- SpringBoot与动态多数据源切换
本文简单的介绍一下基于SpringBoot框架动态多数据源切换的实现,采用主从配置的方式,配置master.slave两个数据库. 一.配置主从数据库 spring: datasource: ty ...
- 算法竞赛入门经典第二版 回文词P49
#include<bits/stdc++.h> using namespace std; char rev[]="A 3 HIL JM O 2TUVWXY51SE Z 8 &qu ...
- 钉钉、钉应用(微应用和E应用)开发介绍
钉钉,数字化新工作方式,让工作更简单 目前在钉钉的官网可以看到,超过700万家企业组织正在使用钉钉.笔者也相信,这一数字每天都在增加.获得群众的认可,也是理所当然的,体验过钉钉,就能感觉到,钉钉的考勤 ...
- 微信小程序 (组件的使用)
创建组件 在根目录创建components目录,然后创建列表组件 组件中内容 <view class="prolist"> //循环prolist列表 <view ...
- makecert 产出证书
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Bin>makecert -r -n // -e // -sv mymuse.pvk my ...
- php preg正则表达式的组成部分
定界符号 : 多种都可以,常用为// 原子 : 最小的一个匹配单位 (放在定界符中),在一个正则表达式中,至少要有一个原子 1,打印字符(a-z A-Z 0-9 ~!@#$%^&*()_+.. ...
- IntelliJ IDEA 2017.3尚硅谷-----设置界面
- Nexus坑人系列-license格式问题
这种情况一般出现在RMA或者新设备使用的时候.这些时候一般需要安装license,在安装完license的时候,例如我们去配置一些三层特性,例如feature eigrp等,可能会出现设备拒绝了你的命 ...
- Win2012或Win2016安装网卡
在电脑安装了Windows Server 2012或者2016等系统之后,可能面临的很大的问题就是没有有线或无线网卡. 1.安装网卡的功能 2.一直到“功能”这部分,选择安装“DirectPlay”和 ...
- VIM - EX 命令 - 文件读写
VIM - EX 命令 - 文件读写 1. 概述 vim 通过 ex 命令行, 与其他文件的读写操作 2. 场景 场景1 vim 打开文本 将当前文本的内容, 写入到其他文本 场景2 vim 打开文本 ...