python函数(初级)

函数

1.匿名函数

"""
匿名函数就是没有函数名的函数:匿名函数可以看成是类型是function的值,和10,'abc'是同类的数据
注意: 匿名函数本质还是函数,函数中除了声明函数以外其他的都使用

1)语法
lambda 参数列表: 返回值

2)说明

  • lambda - 关键字
  • 参数列表 - 参数名1,参数名2,...
  • : - 固定
  • 返回值 - 任何有结果的表达式,它是匿名函数的函数体,相当于普通函数中的return语句
如:lambda x,y: x+y
调用(用一个变量名存储):
fn1 = lambda x,y: x+y
print(fn1(2,3))
  1. 参数
    普通函数中除了用'参数名:类型'的形式来指定参数类型以为,其他的语法匿名函数都支持
10   # int类型的数据
'abc'  # str类型的数据
[1,2,3]  # list类型的数据
lambda x:x  # function类型的数据,一般用做调用

str1 = 'abca'
str2 =str1.replace('a','A')
print(str2)

变量的作用域

1.变量的作用域:变量在程序中能够使用的范围

2.全局变量和局部便令

1)全局变量:没有声明在函数里面或者类里面的变量就是全局变量.
作用域是从声明开始到文件结束的任何位置

2)局部变量:声明在函数中的变量就是局部变量(函数的参数相当于声明在函数中的变量)
作用域是从声明开始到函数结束的任何位置

函数调用过程(内存方面):压栈
当调用函数的时候,系统会自动在内存的栈区间为这个函数开辟一个独立的内纯区域,
用来保存在函数中声明的变量,当函数调用结束后,这个内存会自动释放.

a = 10          # a是全局变量
for x in range(5):           # x是全局变量
    b = 20                   # b是全局变量
    pass


def fun2(y):              # y是局部变量
    z = 100               # z是局部变量

3.global和nonlocal

"""
global和nonlocal函数中的关键字,和return一样只能在函数体中使用
1)global - 在函数中声明一个全局变量
global 变量
变量 = 值

2)nonlocal - 在局部的局部中修改局部变量的值
nonlocal 变量
变量 = 值

# 这里的a是全局变量
a=10
def func3():
  # 这里的a是局部变量
  a = 20
  # 将b定义为全局变量
  global b
  b = 30
  print('函数内部a',a)   # 函数内部a 20
  print('函数内部b',b)   # 函数内部b 30

func3()
print("函数外面a",a)    # 函数外面a 10
print("函数外面b",b)    # 函数外面b 30

def func4():
  a1 = 100
  def func5():
      nonlocal a1
      a1 = 200
      print('函数中的函数中的a1',a1)
  func5()
  print('函数中的a1',a1)
func4()

函数递归

1.声明递归函数

自己调用自己的函数(函数体中调用当前函数)
递归如果产生死循环达到一定程度会报错

注意:
一般循环能做的事情递归都能做
循环能做的一般不要用递归做
递归会在某个点占用大量内存
对cpu的消耗也很高

def func1(n):
    if n>3:
        n-=1
        print(n)
        func1(n)
    else:
        print('2')

# func1(5)

2.怎么写递归函数

第一步:找临界值(循环结束的条件) - 在这儿需要结束函数
第二步:找关系. - 找f(n)和f(n-1)的关系(找当次循环和上次循环的关系)
第三步:假设函数的功能已经实现,根据关系用f(n-1)去实现f(n)的功能

# 用递归实现:1+2+3+4+5+6+...+N
def sum1(n:int):
    # 第一步:找临界值
    if n == 1:
        return 1
    # 第二步:sum1(n)和sum(n-1)
    # sum1(n) = sum1(n-1)+n
    return n + sum1(n-1)


# print(sum1(10))

练习:用递归实现以下功能

def func2(n):
    if n == 1:
        return '*'+'\n'
    return '*'*n + '\n'+ func2(n-1)     # 倒打印
    # return func2(n-1)+'*'*n + '\n'    # 正打印


print(func2(5))

迭代器

1.迭代器(iter)

迭代器宛如一个深不见底的瓶子,看不见里面的数据,只能每次取出看,取出后也放不进去了
迭代器作为容器可以保存多个数据;
数据的来源:1)将其它序列转换成迭代器,2)生成器

1)将其他序列转换成迭代器

iter1 = iter('abc')
print(iter1,type(iter1))

iter2 = iter([12,23,43,54,54])
print(iter2,type(iter2))

2.获取元素

不管用那种方式去获取了元素的值,那么这个元素在迭代器中就不存在了
1)获取单个元素:next(迭代器)/ 迭代器.next() -> 获取迭代器中的第一个元素
2)遍历:同样取完就没有了
for 变量 in 迭代器:
pass

iter3 = iter('hello')
print(next(iter3))    # h,取出就不在放回
print(next(iter3))    # e
print(next(iter3))    # l
print(iter3.__next__())    # l
print(iter3.__next__())    # o,此时已经取完,迭代器为空,再取会报错:StopIteration

生成器

1.什么是生成器

  1. 生成器就是迭代器中的一种
  2. 调用一个带有yield关键字的函数就可以得到一个生成器
    如果一个函数中有yield关键字:
    a. 调用函数不会执行函数体
    b. 函数调用表达式的值不是函数的返回值,而是一个生成器对象
    c. yield后边可以跟数据,相当于return;同一个函数可以有多个yield

2.怎么去创建一个生成器

def func1():
    print('=====')
    yield
    return 100


gen1 = func1()     #这的gen1就是一个生成器对象
# print('外部:',gen1)    # 外部: <generator object func1 at 0x000001A3EF433570>

3.生成器产生数据的原理

1) 一个生成器能够产生多少数据,就看执行完生成器对应的函数的函数体会遇到几次yield;yield后面的值就是生成器能够产生的数据
2) 每次获取生成器中的元素的时候,都是先去执行函数体,直到遇到yield,并且将yield后面的值作为获取元素的结果;
并且保留结束的位置,下次获取下一个值的时候,从上次结束的位置接着执行函数体,知道遇到yield...
如果从开始执行到函数结束到没有遇到yield,就会报StopIteration的错误
注意:return后面的yield是执行不了的,因为函数被终止,遇不到yield

def func2():
    print('++++++')
    yield
    print('--------')
    yield 100


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

推荐阅读更多精彩内容

  • 函数 1、什么是函数 是实现某一特定功能的代码块的封装 2、函数的分类 系统函数(内置函数) - 系统已经实现了的...
    Error_2d57阅读 113评论 0 0
  • 函数 一、匿名函数 匿名函数就是没有函数名的函数;匿名函数可以看成类型是function的值和10,'abc'是同...
    ______n___阅读 145评论 0 0
  • 1.匿名函数 匿名函数就是没有函数名的函数; 匿名函数可以看成是类型是function的值和10, 'abc'是同...
    tcis阅读 133评论 0 0
  • 函数 review 1.概念: 对实现特定功能的代码的封装2.函数的声明def 函数名(形参列表):函数说明文档函...
    漫磋嗟阅读 222评论 0 0
  • 7月18日 星期一 雨转晴 上次,我和杜晨杨去水上游乐场玩。 那里的水很浅,我没有带浮板。我们下了水,一艘鸭小...
    毛毛虫爬呀爬阅读 227评论 0 0