当前位置: 首页 > 编程日记 > 正文

python学习随笔(七)_函数

函数    #作用:封装和复用
    数学定义:y=f(x) ,y是x的函数,x是自变量。y=f(x0, x1, ..., xn)
    Python函数
        由若干语句组成的语句块、函数名称、参数列表构成,它是组织代码的最小单元
        完成一定的功能

    函数的作用
        *结构化编程对代码的最基本的封装*,一般按照功能组织一段代码
        封装的目的为了复用*,减少冗余代码
        代码更加简洁美观、可读易懂
    函数的分类
        内建函数,如max()、reversed()等
        库函数,如math.ceil()等

函数定义、调用
    def语句定义函数
    def 函数名(参数列表):
        函数体(代码块)
        [return 返回值]
        函数名就是标识符*,命名要求一样
        语句块必须缩进,约定4个空格
        Python的函数没有return语句,隐式会返回一个None值
        *定义中的参数列表成为*形式参数*,只是一种符号表达,简称形参
    调用
        函数定义,只是声明了一个函数,它不会被执行,需要调用
        调用的方式,就是函数名加上小括号,括号内写上参数
        *调用时写的参数是*实际参数*,是实实在在传入的值,简称实参

定义时是形参,调用时是实参,调用加小括号

python是动态的,强类型语言
因为是动态的,参数没有定义类型,会带来很大问题(自由工业化开发会带来问题)
无法限制参数类型,除非进行判断
能不能控制这个?是解决团队的问题

函数参数
    参数调用时传入的参数要和定义的个数相匹配(可变参数例外)
    位置参数
        def f(x, y, z) 调用使用 f(1, 3, 5)#顺序对应,个数也要相同#传参,传入实参
        按照参数定义顺序传入实参
    关键字参数    #谁等于谁就是关键字传参(keyword)
        def f(x, y, z) 调用使用 f(x=1, y=3, z=5)    #顺序可以不一样,因为可以按名字找
        使用形参的名字来出入实参的方式,如果使用了形参名字,那么传参顺序就可和定义顺序不同
    传参
        f(z=None, y=10, x=[1])
        f((1,), z=6, y=4.1)
        f(y=5, z=6, 2) #位置参数必须在前,keyword在后是可以的
        要求位置参数必须在关键字参数之前传入,位置参数是按位置对应的


函数参数默认值    #记得时候可以记带等号不可以放前面
  参数默认值(缺省值)
  定义时,在形参后跟上一个值
def add(x=4, y=5):
return x+y
测试调用 add(6, 10) 、add(6, y=7) 、add(x=5) 、add()、add(y=7)、 add(x=5, 6) #这个不可以、add(y=8,
4)、add(x=5, y=6)、add(y=5, x=6)
测试定义后面这样的函数 def add(x=4,y)#非缺省跟在非缺省后不可以(记得时候可以记带等号不可以放前面)
  作用
  参数的默认值可以在未传入足够的实参的时候,对没有给定的参数赋值为默认值
  参数非常多的时候,并不需要用户每次都输入所有的参数,简化函数调用
  举例
  定义一个函数login,参数名称为host、port、username、password
函数参数默认值
 

  在形参前使用*表示该形参是可变参数,可以接收多个实参
****收集多个实参为一个tuple***


可变类型和解构类型,但不全相同(keyword-only)

def fn(*args,x,y,**kwargs)
(x,y)属于keyword-only:在后面 必须定义关键字传参
可以用缺省值,必须使用关键字传参#经常给keyword-only定义缺省值
def add(*,x,y):    #逗号标志后面的是keyword-only


***总结定义形参和传参的几种类型(定义时是形参,调用时是实参)
定义形参:,位置参数,可变位置参数(封装成元组tuple),可变关键字传参(封装成dict字典)


定义传参:位置传参,关键字传参,混着用的时候:位置传参在前,关键字传参在后

普通位置传参:位置传参和关键字传参都支持但是位置传参在前
可变参数:
    可变位置传参:不允许关键字传参,只可以写在一起让可变参数对应#add(1,2,3,4)

    可变关键字传参只收集关键字传参,不可以位置传参


位置参数往放前(可变的也要放前),关键字参数放后(记带星的放后星星放最后)

传参时对应形参必须只有一个,全是关键字传参可以不考虑顺序


函数参数
    参数规则
***参数列表参数一般顺序是,普通参数、缺省参数、可变位置参数、keyword-only参数(可带缺
省值)、可变关键字参数
模版:def fn(x, y, z=3, *arg, m=4, n, **kwargs):
print(x,y,z,m,n)
print(args)
print(kwargs)


参数解构
***只能在参数传参中运用
    传参的时候才解构,解构出元素作为实参

  非字典类型使用*解构成位置参数
****字典类型使用**解构成关键字参数
字典解构:一个*解key,**解字典
add(*{'a': 5, 'b': 6})#解构后为x = 'a',y = 'b'
#add(**{'a': 5, 'b': 6})#解构后为'a' = 5,'b' = 6

函数默认return none,如果想要函数有返回值修改return

------------------------------------------------------------------------------------------------------------------------------------

函数返回值
return 语句
一个函数只有一条return语句

多分支结构可以有多条return,但只能执行一条return
#多分支结构可以设置个变量,最后return变量,可以省着每次分支都写return
if..ret=..else..ret=..最后return ret

函数可以返回值可以不同类型
一个函数只要碰到return就立即返回终止

函数默认return none,往往函数需要写return

return返回必须是一个值,不是一个会被它封装成一个元组
返回多个值包在容器中  得到它们使用解构一一对应
---------------------------------------------------------------------------------------------------------------------------
作用域****
嵌套函数
    函数内部的函数不可以在外部单独执行#因为在外部没有定义,报NameError

    在外部的函数可以调用嵌套在内的函数

****###函数是有可见范围的,这就是作用域

函数内部的标识符(变量),外部是不可见的


函数定义直接过,执行时看前面定义有没有用到变量

函数内部
x = 5
def show():
    x += 1#报错
    print(x)
show()

x = x +1    #在函数内部要先定义,要不然会说内部没有定义
    #右边x+1,赋值即重新定义,赋值要先算右边,
    #右边是内部本地变量(本地作用域),x要重新定义

嵌套函数:赋值即重新定义,但是是定义自己的变量

全局作用域    #在整个运行环境中都可见

局部作用域(local)    #在函数和类等内部中可见

---------------------------------------------------------------------------------------------------------------------------
全局作用域(了解,写函数基本不用,改动影响太大)
global x    #使用全局作用域变量
    #尽可能放在前面第一行

global 用在局部作用域中定义一个全局作用域中操作变量
但是global只影响当前作用域

函数应该用定义形参,传参这种形式用,尽量不要用global

---------------------------------------------------------------------------------------------------------------------------

闭包***#一般在有嵌套函数时候用

自由变量:未在本地作用域中定义的变量。例如定义在内存函数外的外层函数的作用域中的变量

本来变量在外层函数  内层函数用到了这个局部变量,闭包就已经产生


nonlocal    关键字
    #声明变量不在本地作用域中,但是在外层作用域中找,但是不会再全局作用域中找
    #形成闭包
    #一层层向外找但不在全局中找
    #不可在全局下一层中用(因为全局中的下一层可以直接用全局变量了)
形参可以当局部变量来看

---------------------------------------------------------------------------------------------------------------------------

默认值的作用域

函数也是对象,如果对象中包含引用类型时,会更改默认值,简单类型不会更改默认值

函数名.__defaults__        #查看默认值属性,使用元组保存所有位置参数默认值#使用元组位置就不会变
函数名.__kwdefaults__    #查看使用字典保存所有keyword-only参数的默认值,dict是关键字传参


缺省值函数默认的特殊属性,生命周期跟函数同样周期共消亡

缺省值只有自己的作用域的,要看缺省值指的是什么,如果指的是缺省值送给形参,形参的作用域就在函数内部,它是局部作用域中的局部变量

#default这个东西它又属于函数对象本身的特殊属性,它是放在函数对象上的
#函数对象是和函数定义相关的,函数在定义时它的标识符(形参)关联到它内存中创建的那一个函数对象上去了


默认值作用域为形参用,形参可以当函数的局部变量来看
如果形参可变的类型(如列表),(无缺省值)没有固定的缺省值,有缺省值也会变的
#有时候这个特性是好的,有的时候这种特性是不好的,有副作用

def foo(xyz=[], u='abc', z=123):
    xyz.append(1)
    return xyz
print(foo(), id(foo))
print(foo.__defaults__)
print(foo(), id(foo))
print(foo.__defaults__)#引用类型默认值改变


def foo(xyz=[], u='abc', z=123):
   #xyz = foo.__defaults__
    xyz = xyz[:] # 影子拷贝,简单类型空列表内存中新生成一份,内存地址不同
    xyz.append(1)
    print(xyz)
foo()
print(foo.__defaults__)
foo()
print(foo.__defaults__)
foo([10])
print(foo.__defaults__)
foo([10,5])
print(foo.__defaults__)#不改变默认值


def foo(xyz=None, u='abc', z=123):#使用不可变类型默认值
    if xyz is None:#使用默认值时创建列表
        xyz = []
        xyz.append(1)# 如果传入一个列表,就修改这个列表
    print(xyz)
foo()
print(foo.__defaults__)
foo()
print(foo.__defaults__)
foo([10])
print(foo.__defaults__)
foo([10,5])
print(foo.__defaults__)

第一种方法
    使用影子拷贝创建一个新的对象,永远不能改变传入的参数
第二种方法
    通过值的判断就可以灵活的选择创建或者修改传入对象
    这种方式灵活,应用广泛
    很多函数的定义,都可以看到使用None这个不可变的值作为默认参数,可以说这是一种惯用法


---------------------------------------------------------------------------------------------------------------------------

变量名解析原则LEGB        #一个名词的查找顺序就是LEGB,一层一层向外解析
LEGB规定了查找一个名称的顺序为:local-->enclosing function locals-->global-->builtin

Local,本地作用域、局部作用域的local命名空间。函数调用时创
建,调用结束消亡

Enclosing,Python2.2时引入了嵌套函数,实现了闭包,这个就
是嵌套函数的外部函数的命名空间

Global,全局作用域,即一个模块的命名空间。模块被import时
创建,解释器退出时消亡

Build-in,内置模块的命名空间,生命周期从python解释器启动
时创建到解释器退出时消亡。例如 print(open),print和open都是内置的变量

---------------------------------------------------------------------------------------------------------------------------

函数的销毁
#函数的定义一般只做一次,除非你想把它覆盖掉再定义一次
#定义函数的目的就是复用,要明确为什么要销毁,不要轻易销毁

全局函数的销毁
     重新定义同名函数
    del 语句删除函数对象
    程序结束时

局部函数销毁
    重新在上级作用域定义同名函数
    del 语句删除函数名称,函数对象的引用计数减1
    上级作用域销毁时

--------------------------------------------------------------------------------------------------------------------------

递归函数

#栈和线程相关,栈是每个线程自己的空间
函数执行要压栈,一个落一个,函数局部变量也要压栈,用完后弹出
#局部变量,函数调用时创建,调用结束消亡

递归 Recursion
函数直接或者间接调用自身就是递归

递归一定要有退出条件 return 出一个结果
每次计算后也要return


import sys
print(sys.getrecursionlimit)    #查看递归层数

---------------------------------------------------------------------------------------------------------------------------

匿名函数

格式
    lambda 参数列表 : 表达式

map是生成一个惰性求值的

(lambda x : 0)(3)
冒号后面不可以用等号
---------------------------------------------------------------------------------------------------------------------------
生成器***
生成器generator

next()    #

生成器函数必须包含yield语句,生成器函数的函数体不会立即执行

协程    #非抢占式,轮询

yield from    #新语法从可迭代对象中一个个拿元素
for x in range(10)  =>   yield from range(10)
    yield x


转载于:https://www.cnblogs.com/springquanquan/p/9573783.html

相关文章:

计算机控制里ddc什么缩略语,空调自动化术语和缩略语.doc

空调自动化术语和缩略语1.6 空调自动化术语和缩略语1.6.1 术语解释Application—Specific Controller,专用控制器:专用控制器是意图连接一个或几个设备以便提供某种特殊功能的数字控制器。专用控制器通常有固定的控制算法和有限的参数调整。Automatic Communication…

Linux中重定向--转载

转:http://blog.csdn.net/songyang516/article/details/6758256 1重定向 1.1 重定向符号> 输出重定向到一个文件或设备 覆盖原来的文件>! 输出重定向到一个文件或设备 强制覆盖原来的文件>> 输出重定向到一个文件或设…

matlab 2010无法运行程序,matalb r2010a安装后打开出现一系列警告,无法运行,哪位大神帮...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Matlab R2010a安装完成后的错误:Warning: D:\Program Files\MATLAB\R2010b\toolbox\local\pathdef.m not found.Toolbox Path Cache is not being used. Type help toolbox_path_cache for more info Undefined functio…

小米4c怎么添加语言怎么设置在哪里,小米4c路由器设置教程

摘要 腾兴网为您分享:番茄小说,唱吧app,酷狗,腾讯会议,唯品会等知识经验教程,欢迎大家关注腾兴网。小米4c路由器该怎么设置,不少小伙伴们不清楚设置方法是什么,想要知道该怎么设置的&#xff0c…

用PHP计算个税,PHP计算个人所得税示例【不使用速算扣除数】

本文实例讲述了PHP计算个人所得税。分享给大家供大家参考,具体如下:不使用速算扣除数计算个人所得税,PHP自定义函数实现个人所得税计算。使用速算扣除数计算个人所得税过于简单,略过不提。PHP和JS有相同之处,知道PHP计…

mono+jexus 部署之CompilationException

使用 HelpPage 组件 CompilationException 好不容易在ubuntu上搭建了monojexus,欣喜若狂的部署上发布的网站,急忙打开,成功运行。 但是别高兴的太早,当我打开WebApi帮助页时出现了CompilationException。 解决办法 修改 WebConfig…

MAC 重置MySQL root 密码

MAC 重置MySQL root 密码 重置MySQL root 密码:当忘记密码,或者想要强行重置 MySQL 密码的时候,可以像下面这样: 1.停止 MySQL 服务 12sudo /usr/local/mysql/support-files/mysql.server stop//当停止失败 见下边 如何用mac 活动…

计算机二级vlookup引用怎么操作,VLOOKUP函数怎样引用二个条件

函数 LOOKUP的数组形式是在数组的第一行或第一列中查找指定数值,然后返回最后一行或最后一列中相同位置处的数值。如果需要查找的数值在数组的第一行或第一列,就可以使用函数LOOKUP 的这种形式。当需要指定列或行的位置时,可以使用函数 LOOKU…

android 自定义录像机,android-camera2 - 将自定义捕获请求构建器选项设置为使用Camera2 API捕获图像以使用OpenCV库进行摄像机校准 - 堆栈内存溢出...

我们正在使用Camera2 API捕获N张图像,而未设置任何自定义捕获请求构建器选项。 我们正在使用这些图像通过OpenCV Android库411进行相机校准。然后,我们正在使用OpenCV Android库进行图像失真处理。 角落处的输出图像不清晰,角落向中心缩小。 …

java读取配置文件信息

String configfile "cfg/client.cfg";// 读取配置文件账号密码Properties props new Properties();InputStream in new BufferedInputStream(new FileInputStream(configfile));props.load(in);String userName props.getProperty("userName");String …

php explore im,浏栏器器-explore.class.php_php

//原作者:epsilon7//SonyMusic(sonymusic163.net)class BrowserDetector {var $UA ""; //$HTTP_USER_AGENT的内容var $BROWSER "Unknown"; //浏览器类型http://www.gaodaima.com/46792.html浏栏器器-explore.class.php_phpvar $PLATFORM &quo…

计算机评语公式怎么输,在excel中,如何使用公式写评语

2006-03-17还有1个多月就要考英语专4了,请问大家,现在该怎么复习呢?还有专4的补考和初考哪个难啊,通过率有多少啊?首先我想说的是因为你们学校的原因要你们补考,那我想这个证书是会得到国家的认可的。然后就是复习。一…

001_python单元测试

一、同事推荐的 pytest库 > 官网:http://doc.pytest.org/en/latest/ github地址>https://github.com/pytest-dev/pytest/ 二、python标准库的unittest的特性和java的junit很相似。 转载于:https://www.cnblogs.com/arun-python/p/6568631.html

三星android获取root权限,三星G9250(S6 Edge公开版全网通 Android 5.1)获取ROOT权限详解教程...

伴随着安卓刷机越来越流行,很多安卓用户都喜欢上了这种可以自定个性系统的行为,那么三星G9250(S6 Edge公开版全网通 Android 5.1)怎么获取ROOT权限?三星G9250(S6 Edge公开版全网通 Android 5.1)一ROOT过程如何操作呢?奇兔小编在此大家说一说一键ROOT的…

认识和了解python

一: Python介绍 1.1 python创始人吉多.范罗苏姆(龟叔)在1989年开发.python崇尚优美,清晰,简单. 1.2 python是一门解释型语言,属于弱类型语言. 1.3 优点: 1.优雅,明确,简单 2.开发率高 3.可移植性,可扩展性,可嵌入型 缺点: 1.速度慢, 2…

惰性求值 php,详细介绍C#函数式编程的示例代码

public double MemoryUtilization(){//计算目前内存使用率var pcInfo new ComputerInfo();var usedMem pcInfo.TotalPhysicalMemory - pcInfo.AvailablePhysicalMemory;return (double)(usedMem / Convert.ToDecimal(pcInfo.TotalPhysicalMemory));}public int BigCalculatat…

wowpve服务器优势,PVE服务器法师对本职业的一点看法

看过了各位高手的对法师的一些看法,其中被喷的也不在少数,其实大家公认的在魔兽世界里没有最强的职业,只有更强的玩家,所有流派的诞生都是各位玩家在不断的探索中发现的,我是一个休闲法师玩家在这里只谈谈自己的一些看…

安装Android SDK需要选择哪些,开始为Android开发,我应该选择安装哪些SDK?

我开始将我的开发人员技能扩展到Android开发.我安装了所有的工具和配置,每件事看起来都很棒,作为默认设置,我安装了3.2 SDK,但是没有太多的文档在那个,2.x SDK上的模式是什么.它是否像IOS,android有一个良好的向后可计算性?我可以继续使用3.x并依靠它(使用2.x SDK中…

oracle 分区使用情况,Oracle Hash分区的使用总结

近期项目需要用到分区表,但是分区键值有无法确定,因此只能使用hash分区(range、list分区以前常用,比hash分区简单),查询了文档,发现上面说的和实际使用时有点差距,就专门做实验验证下。官方文档(11g、12c的…

第四周工作总结

转载于:https://www.cnblogs.com/yuezhihao/p/6587333.html

VS2013\VS2017 使用git 总是需要输入账号密码

问题: VS2013\VS2017 使用git 总是需要输入账号密码 解决方案:删除原凭证,或者修改原凭证,重新输入一次账号和密码并且选择“记住凭证”即可! 转载于:https://www.cnblogs.com/zhaokunbokeyuan256/p/9583091.html

css炫酷标题,纯css3鼠标滑过图片炫酷标题显示特效

很多网站的图片鼠标滑过显示标题效果都是使用jQuery来完成的,现在,我们可以使用CSS3 animations来完成同样惊艳的效果。如果你对CSS3 animations还不了解,请先阅读CSS3 animations。HTML我们使用html5来制作这款插件。通过figure和figcaption…

学习成长就到鸿蒙思维,庆国庆,迎中秋,鸿蒙教育享双节99元开启思维之旅!!...

原标题:庆国庆,迎中秋,鸿蒙教育享双节99元开启思维之旅!!庆国庆,迎中秋,鸿蒙教育享双节99元开启思维之旅!!鸿蒙口才+绘画课推出99元体验课程!学1科…

String拼接字符串效率低,你知道原因吗?

面试官Q1:请问为什么String用""拼接字符串效率低下,最好能从JVM角度谈谈吗? 对于这个问题,我们先来看看如下代码: public class StringTest {public static void main(String[] args) {String a "abc&…

oracle01003,ORA-01003:nostatementparsed-Oracle

手贱,故意删除了一张表,在OGG同步数据的同时,删除之后立刻报错,如下:OCI Error ORA-12096: error in materialized view log on "JTINFO"."TBL_USERID"ORA-01003: no statement parsed (status 1…

笔记一:python安装和执行

一:学习内容 python安装python简介python执行二:python安装 1. 下载python,网地址:https://www.python.org/,进入地址后,点击下载downloads下的windows 2. 进入下载页后,选择要下载的版本和类型…

一个客户机-服务器系统使用了卫星网络,客户机/服务器体系结构可用于局域网、广域网和WWW。这三种用途迥异的网络的一个共同特点是工作负 - 试题答案网问答...

相关题目与解析关于客户机/服务器体系结构的错误说法是()A.曾经是一种流行的结构B.可用于广域网C.不可用于万●C/S(客户机/服务器)与B/S(浏览器服务器)体系结构的区别是:(57)。(57)A.B/S建立在局域网上,C/S●C/S(客户机/服务器)与…

android 初始化语言,3.4.1 Android初始化语言(1)

3.4 init.rc文件解析过程init.rc文件按照一定的格式组织,要分析init.rc文件的解析过程,首先要熟悉它的格式。init.rc的文件格式由Android初始化语言(Android Init Language)定义,所以这里首先分析Android初始化语言。3.4.1 Android初始化语…

[bzoj3673/3674可持久化并查集加强版]

n个集合 m个操作 操作&#xff1a; 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合&#xff0c;是则输出1否则输出0 0<n,m<2*10^5 强制在线。 这两题一题都一样&#xff0c;另一题比较水&#xff0c;nm只有2*10^4,允许…

[Manthan, Codefest 18][Codeforces 1037E. Trips]

题目链接&#xff1a;1037E - Trips 题目大意&#xff1a;有n个人&#xff0c;m天&#xff0c;每天晚上都会有一次聚会&#xff0c;一个人会参加一场聚会当且仅当聚会里有至少k个人是他的朋友。每天早上都会有一对人成为好朋友&#xff0c;问每天晚上最多能有多少人参加聚会。朋…