博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python 函数
阅读量:5021 次
发布时间:2019-06-12

本文共 3905 字,大约阅读时间需要 13 分钟。

什么是函数即定义:函数是指将一组语句的集合通过一个名字封装起来,要想执行函数,直接调用函数名就可以了

 

特性:1、减少逻辑代码  2、使程序变得可扩展  3、易于维护

语法:

作用域:

全局变量:

局部变量:

 

函数参数:

  形参:只需要在函数被调用的时候才会,被分配内存空间,用完即刻释放,所以它的生存周期是十分短暂的。

      因此:形参只有在函数内部才有效

  实参:必须有确定的值,用来赋值给形参。无论实参是何种类型的数据,在进行函数调用时,必须拥有值。

  默认参数:在函数定义阶段就存在值的参数、在调用阶段可以不指定值。[默认参数一般放在其它参数后面]

        def  fun(args='我是参数')

            print(args)

  关键字参数:在调用阶段不指定名称的情况下,必须严格按照参数原有顺序进行传值。指定了名字就可以打破顺序

  def pri(age,name,height):

print(age,name,height)   pri(12,'egon',1.8)   pri(name='egon',age=12,height=1.8)   >>:12 egon 1.8   >>:12 egon 1.8 非固定参数:   假如你的函数在定义阶段不知道用户需要传递多少个参数,就可以使用非固定参数   def fun(age,name,*args,**kwargs):#*args 会把多传入的参数变成一个元组形似\                       #**kwargs 会被多余的关键字参数 变成dict 形式    函数返回值: 不管是显示指定了return 还是 没有指定 对象的,都会被return 停止并且返回值   没有指定return 的函数 ,隐式:return None 嵌套函数: 匿名函数:     不需要显示指定函数名的函数   定义形式:      高阶函数:     满足任意条件即是 高阶函数:     1.接收一个或者多个函数作为输入     2.return 返回另外一个函数 递  归:   1.必须有明确的结束条件   2.每次进入更深一层递归时,问题的规模都比上一次有所减少   3.递归效率不高,递归过多,会导致栈溢出【原因:因为栈不是无限大的】 函数进阶: 名称空间:名称空间是存放变量名 与 其对应的值绑定关系的地方   locals:是函数内的名称空间,包括局部变量和形参   globals:全局变量:函数定义所在模块的名字空间   builtins:内置模块的名字空间 不同变量作用域不同,就是由这个变量所在的名称空间决定的 作用域:就是范围,有效的范围,生存的范围 全局范围:全局存活,全局有效 局部范围:临时存活,局部有效 查看作用域的方法:   globals()   locals() LEGB 查找范围:locals->encolsing function->globals->__builtins__ locals:函数内的名字空间,包含局部变量和形参 encolsing:外部嵌套函数的名词空间 globals:全局变量,函数定义所在的模块 __builtins__内置模块的名称空间 闭包:   函数的定义和函数体都在另外一个函数体内(嵌套函数),并且此函数还可以访问外部的函数内变量 闭包意思:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域 装饰器:   封闭:已经实现的功能代码块不应该被修改,   开发:对现有功能的扩展开发 带参装饰器: folder:   core/admin/   core/user/    user_status={'name':None} admin_status={'name':None} def login(auth_type='user'):   from core import admin,user   def auth(func):     def wrapper(*args,**kwargs):       if auth_type=='admin':          if not admin.admin_status['name']:             admin.login()       if auth_type=='user':          if not user.user_status['name']:             user.login()       return func(*args,**kwargs)     return wrapper   return auth @auth() def index():   pass @auth() def play():   pass @auth def update():   pass      @auth('admin') def admin_create_user():   pass          生成器 & 迭代器 列表 生成式:生成器,迭代器 sample: lis= [i for i in range(1,9)] 将lis内所有元素加1 #方法一 for i in enumerate(lis):   lis[i]+=1 #方法二 lt=map(lambda x:x+1,lis) print(lt)

  

#方法三:

lt=[ element+1 for element in lis  ]

 

生成器:一边循环一边计算的机制

 

 

一、序列赋值:

x,y,z = 1,2,3

我们可以看作:x = 1,y = 2,z = 3

二、链接赋值:

x = y = 1

print id(x)
print id(y)

大家可以看下,2个执行的结果是一样的。说明变量x和y都是存储了整数对象1的引用地址。

三、增量赋值。

比如x = x + 1 我们可以改成x+=1

掌握上面的3点,相信你对赋值操作有一个很好的了解了

 

四、交叉赋值

a=5 b=9 a,b=b,a print(a,b) >>:9 5 数据解压 ,赋值的活用

有时候需要根据比较大小分别赋值:

 

 

import random
seq = [random.randint(0, 1000) for _ in range(100)]
 
#方法1:
xmax, xmin = max(seq), min(seq)
 
#方法2:
xmax, *_, xmin = sorted(seq)

 

从上面这个来看,看不出来方法2的优势来,不过我们常用的是比较两个数的大小,并选取:

dx, dy = random.sample(seq, 2)
 
#方法1:
dx, dy = min(dx, dy), max(dx, dy)
 
#方法2:
dx, dy = sorted((dx, dy))

 迭代器:

我们知道直接进行for 循环的

一类为:数据类型:list、tuple、dict、set、str等

另外一类为:generator,包括生成器和带yield 的generator function

这些可以直接作用于for 循环的对象统称为可迭代对象:Iterable

from collections import  Iterable print(isinstance([],Iterable)) # True print(isinstance({},Iterable)) # True print(isinstance([i for  i in range(1,10)],Iterable)) # True print(isinstance('abc',Iterable)) # True print(isinstance(123,Iterable)) # False 生成器都是Iterable对象4
print() print(isinstance([],Iterator)) # False print(isinstance({},Iterator)) # False print(isinstance([i for  i in range(1,10)],Iterator)) # False print(isinstance('abc',Iterator)) # False print(isinstance(123,Iterator)) # False Iter()将Iterable对象转换为Iterator 迭代器 iterable=[i for  i in range(1,10)] iterator=iter(iterable) print(isinstance(iterator,Iterator))

 凡是可以用for循环的都是Iterable类型

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列

集合数据类型如:list dict str 等是Iterable 但不是Iterator,不过可以通过Iter()函数获得一个Iterator对象

python 3.x 的for 循环本质上就是不断调用next()函数实现的。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    

 

转载于:https://www.cnblogs.com/yanxiatingyu/p/9280478.html

你可能感兴趣的文章
GitHub开源库排名一百的简单介绍,值得收藏!
查看>>
CentOS yum install mysql配置远程访问
查看>>
如何对vue项目进行优化,加快首页加载速度
查看>>
网摘读书笔记----javascript语言精粹
查看>>
字符串长度计算函数
查看>>
一个有python扩展库的下载网站
查看>>
JS中的prototype
查看>>
Windows Phone 文本表情显示控件
查看>>
adm下载器
查看>>
cxf-rs 和 swagger 的点
查看>>
GJM : 游戏程序员的学习之路
查看>>
【图像处理】如何改变图像的曲线?
查看>>
[转载]C#实现获取浏览器信息
查看>>
html 面试复习
查看>>
暑假周总结五
查看>>
125.C++输入小结
查看>>
关于如何验证windows下的盘符路径问题
查看>>
Point in polygon algorithm C code
查看>>
linux基本命令学习
查看>>
[C++面试]关于const的使用方法
查看>>