Python-函数的总结

一 、为什么用函数:

1、 代码重复

2、 代码可描述性不高

3、 代码太low

函数是以功能为导向,一个函数封装一个功能,函数减少代码的重复性,增强了代码的可读性。

二 、函数的结构、调用和返回值


def func():

    pass

func()

return:给函数的执行者返回具体的值、在函数中遇到return直接结束函数。
1.函数中没有return或者只有写一个return,函数的执行者得到的是None。
2.函数中return后面只写一个参数 执行者得到的就是这个参数(不改变值得类型)
3.return 返回多个元素 是以元组的形式返回给函数的执行者。

三 、函数的传参

分两个角度:实参、形参。

实参角度:
    位置参数    (从左至右,按照顺序,一一对应)
    关键字参数   (一一对应)
    混合参数    (位置参数一定要在关键字参数的前面。)
形参角度:
    位置参数    (与实参角度参数一样)
    默认参数    (意义:普遍经常使用的。一定在位置参数后面,不传参数即沿用默认的参数)
    动态参数     (*args,**kwargs)
#*代表聚合。 他将实参角度所有的位置参数聚合成一个元组,赋值给了 args
#** 将实参角度所有的关键字参数聚合到一个字典中,将这个字典赋值给了kwargs
#*的魔性用法:(当函数执行时:*代表打散)返回的是元祖
#** 的魔性用法:(当函数执行中:**dict  代表打散)返回的是字典
    仅限关键字参数(没用)

四 、 名称空间、作用域

全局名称空间:py文件运行时,存放的是执行的py文件(除去函数内部)的所有的变量与值(地址)的对应关系,整个py文件结束之后,才会消失.
临时(局部)名称空间:函数执行时,在内存中临时开辟的一个空间,存在的函数中的变量与值得对应关系,随着函数的结束而消失.
内置名称空间:print input 内置函数等.

LEGB原则:(从局部找时)局部名称空间 ---> 全局名称空间 ---> 内置名称名称空间

全局作用域:内置名称空间 全局名称空间
局部作用域:局部名称空间(局部作用域不能改变全局变量)
globals(获取全局作用域)
locals(获取当前作用域)
global:可以在局部作用域声明一个全局变量,也可以更改全局变量
nonlocal:不能够操作全局变量。(内层函数对外层函数的局部变量进行修改。并且在当前作用域创建(复制)一份此变量。)

五 、迭代器和生成器

 内部含有__iter__方法的对象,就是可迭代对象(dir()判断是否是可迭代对象)
 内部含有__iter__并且含有__next__方法的对象,就是迭代器(迭代器可以迭代取值。利用next()进行取值)
 可迭代对象:可迭代对象是一个操作比较灵活,直观,效率相对高,但是比较占用内存的数据集。
 迭代器:迭代器是一个非常节省内存,满足惰性机制,但是效率相对低,操作不灵活的数据集。
生成器和迭代器的唯一的区别:生成器是我们自己用python代码构建的数据结构。迭代器都是提供的,或者转化得来的。
获取生成器的三种方式:
    生成器函数
    生成器表达式
    python内部提供的一些
yield 、return区别
return:函数中只存在一个return结束函数,并且给函数的执行者返回值。(多个值通过元组的形式返回)
yield:只要函数中有yield那么它就是生成器函数而不是函数了。生成器函数中可以存在多个yield,yield不会结束生成器函数,一个yield对应一个next。(多个值以元组的形势返回)
yield from 将一个可迭代对象的每一个元素返回给next
yield from 节省代码,提升效率(代替了for循环)

六 、列表表达式和生成器表达式

列表推导式:一行代码构建一个有规律比较复杂的列表
1.循环模式: [变量(加工后的变量) for 变量 in iterable]
2.筛选模式: [变量(加工后的变量) for 变量 in iterable if 条件]
生成器表达式:与列表推导式一样(取值用next)

七 、内置函数

Python有68种内置函数

eval()  慎用 eval 剥去字符串的外衣,返回里面的本质
exec() 代码流,过程
hash() 哈希值
help() 帮助
callable() 判断一个对象是否可被调用 
int()  取整数
bin() 将十进制转换成二进制并返回
ord() 输入字符找该字符编码的位置
chr() 输入位置数字找出其对应的字符
repr() 原形毕露
sep 设定分割符
end 默认是换行可以打印到一行
list:创建列表
dict:创建字典
abs()  获取绝对值
sum() 数字相加求和
min 可以加功能  以绝对值的方式取最小值(可以加匿名函数)
max() 与min 相同。
reversed()  对一个可迭代对象进行翻转,返回一个迭代器
zip 拉链方法 返回一个迭代器
sorted 排序(可以加key)
filter  返回一个生成器  # 生成器表达式的筛选模式
map 返回一个迭代器,相当于生成器表达式:循环模式
reduce python3x 从内置函数剔除了。是一个累加函数这个函数必须接受两个参数,把结果继续和序列的下一个元素做累计算

八 、 闭包、装饰器

    闭包有什么作用:封装东西、保证数据安全
    被引用的非全局变量也称作自由变量,这个自由变量会与内层函数产生一个绑定关系,
    自由变量不会再内存中消失。
    如何判断一个嵌套函数是不是闭包
    闭包只能存在嵌套函数中。
    内层函数对外层函数非全局变量的引用(使用),就会形成闭包。
开放封闭原则
装饰器:在不改变原函数的代码以及调用方式的前提下,为其增加新功能
标准的装饰器:
def wrapper(f):
    def inner(*args,**kwargs):
        '''添加额外的功能:执行被装饰函数之前的操作'''
        ret = f(*args,**kwargs)
        ''''添加额外的功能:执行被装饰函数之后的操作'''
        return ret
    return inner
带参数的装饰器:
def wrapper_out(n):
   def wrapper(f):
      def inner(*args,**kwargs):
        '''添加额外的功能:执行被装饰函数之前的操作'''
        ret = f(*args,**kwargs)
        ''''添加额外的功能:执行被装饰函数之后的操作'''
        return ret
    return inner
@wrapper_out('参数')
多个装饰器装饰一个函数:
def wrapper1(func1): 
    def inner1():
        print('wrapper1 ,before func') 
        func1()
        print('wrapper1 ,after func') 
    return inner1

def wrapper2(func2): 
    def inner2():
        print('wrapper2 ,before func') 
        func2()  
        print('wrapper2 ,after func')  
    return inner2

@wrapper2 
@wrapper1
def f():
    print('in f') 
f()  

九 、 递归函数

递归的最大深度1000层 : 为了节省内存空间,不要让用户无限使用内存空间
一个递归函数要想结束,必须在函数内写一个return,并且return的条件必须是一个可达到的条件

递归个列表里面的列表
l1 = [1, 3, 5, ['上海','北京', 34, [33, 55, [11,33]]], [77, 88],66]
def func(alist):
    for i in alist:
        if type(i) == list:
            func(i)  
        else:
            print(i)    #python3
func(l1)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容

  • 内置函数Python解释器内置了许多功能和类型,总是可用的。他们是按字母顺序列在这里。 abs(x)返回一个数的绝...
    uangianlap阅读 1,231评论 0 0
  • 一、常见的内置函数 1. 查看内置函数: 2. 常见函数: 3. 进制转换函数: 4. 补充: (1) enume...
    奋斗在阿尔卑斯的皮卡丘阅读 812评论 0 0
  • 变量 命令a = 1,解释器会创建整形1和变量a,并把a指向1,整形1也可以是各种类型的数据. 函数 函数是指将一...
    Knight方阅读 388评论 0 1
  • 我是一个语言功底很差的人,前方高能,请谨慎阅读! 成长 我的个性是一种十分开朗的个性。 这种个性大部分情况下还算比...
    wenwugu阅读 387评论 0 0
  • 正院内 安王和王妃正在屋中下棋。 黑子冲锋陷阵,棋风凌厉;白子收放自如,棋风温和。 黑子暗藏杀机,白子以退为进。 ...
    君清兮阅读 305评论 0 0