python笔记day9 - 函数2

一、变量的作用域

1、变量的作用域

变量在程序中能够使用的范围

2、全局变量

a.声明在函数或者类的外部的变量都是全局变量

b.变量的作用域:从声明开始到整个py文件结束,任何位置都可以使用(作用域:从声明开始到文件结束)

3、局部变量

a.声明在函数或者类的内部的变量就是局部变量

b.变量的作用域:从声明开始到函数结束,任何位置都可以使用

4、golbal的使用

golbal关键字只能在函数中使用

作用:在函数内声明一个全局变量

语法:

golbal 变量名

变量名 = 值

5、nonlocal的使用  (用到的非常少,理解就行)

nonlocal关键字只能在函数中使用

作用:在局部的局部中修改局部变量的的值

语法:

nonlocal 变量名

变量名 = 值

"""

# 思考?

funtions = []

for xin range(5):

def func1(a):

return a*x

funtions.append(func1)

t1 = funtions[0]

t2 = funtions[2]

print(t1(2),t2(2))

"""

二、函数作为变量

python中,声明函数其实就是声明一个类型是function的变量。函数名就是变量名

函数名作为变量除了可以用来调用函数获取返回值以外,普通变量能做的它都能做。

"""

# 声明类型是int类型的值a

a=10

print(type(a))

# 声明类型是dict类型的变量b

b = {'a':12,'b':200}

print(type(b))

print(b['a'])

# 声明类型是function类型的变量c

c =lambda x: x*x

print(type(c))

c(10)

# 声明类型是function类型的变量d

def d(x):

def e():

print('abc')

e()

return x*x

print(type(d))

d(10)

# 1、让一个变量给另外一个变量赋值

#声明一个列表变量list1

list1 = [1,2,3]

# 使用列表变量list1给list2赋值

list2=list1

print(list2[0])

# 声明一个函数变量func11

def func11():

print("我是函数")

# 使用函数变量func11给ff赋值

ff = func11

# 将ff当成函数来用

ff()

# 2、将变量作为列表的元素或者是字典的值

# 声明列表变量list1

list1 = [1,2,3]

# 将列表变量list1作为列表list2的元素

list2 = [list1,100]

print(list2[0][0])

# 声明一个函数变量func2

def func2():

print("我是函数2")

# 将函数变量func2作为列表list3的元素

list3 = [func2,100]

print(list3[0]())

# 3、作为函数的参数

# 将函数1作为实参,传递给函数2;这儿的函数2就是一个高阶函数(实参高阶函数)

def test(x):

print("text:",x)

if not isinstance(x,int):

x()

# 声明一个int类型的变量a

a =10

# 将变量a作为test的实参

test(a)

def func3():

print("我是函数3")

test(func3)

#3.1  sort函数

"""

def sort(key=None,reverse=False)

key - 确定排序的时候以什么值为标准来排序(默认的情况下,以列表的元素的大小为标准来排序)

需要传一个函数,函数需要一个参数和一个返回值。这的参数是列表的元素

reverse - 是否降序排序,需要穿一个bool值

"""

def yt_sort(list1,key):

if key ==None:

for indexin range(len(list1)):

for index2in range(index+1,len(list1)):

current = list1[index]

behind = list2[index2]

if behind

list1[index],list2[index2] = list2[index2],list1[index]

else:

for indexin range(len(list1)):

for index2in range(index+1,len(list1)):

current = key(list1[index])

behind = key(list2[index2])

if behind

list1[index],list2[index2] = list2[index2],list1[index]

my_list = [1,34,20,89,8]

# yt_sort(my_list)

# my_list.sort()

print(my_list)

my_list2 = [

{'name':'张三','age':18},

{'name':'李四','age':30},

{'name':'王五','age':10}

]

# my_list2.sort() # TypeError: '<' not supported between instances of 'dict' and 'dict'

# yt_sort(my_list2) # TypeError: '<' not supported between instances of 'dict' and 'dict'

def get_age(x):

return x['age']

yt_sort(my_list2, get_age)

print(my_list2)

my_list2 = [

{'name':'张三','age':18,'score':90},

{'name':'李四','age':30,'score':80},

{'name':'王五','age':10,'score':89}

]

# 取最大年龄对应的字典

max_age =max(my_list2,key=lambda x: x['age'])

print(max_age)

# 取最大成绩对应的字典

max_score =max(my_list2,key=lambda x: x['score'])

print(max_score)

# 4.变量作为函数的返回值

# 返回值是函数的函数,也叫高阶函数(返回值高阶函数)

def test2(n):

sum1 =1

    for xin range(1, n+1):

sum1 *= x

return sum1

re = test2(5) +10

print(re)

# =================================

def get_operation(char):

# char = '+'    (不能使用单行注释)

"""

根据不同的符号返回不同的功能(函数功能的描述)

    :paramchar: 运算符符号

    :return: 不同运算符对应的功能的函数

"""

    if char =='+':

# 求和的功能

        def sum(*args, **kwargs):

# args = (10,20,30)

"""求多个数的和"""

            sum1 =0

            for item1in args:

sum1 += item1

for keyin kwargs:

sum1 += kwargs[key]

print('yt')

return sum1

return sum

elif char =='*':

def mul(*args, **kwargs):

sum1 =1

            for item1in args:

sum1 *= item1

for keyin kwargs:

sum1 *= kwargs[key]

return sum1

return mul

elif char =='-':

def diff(*args):

"""求多个数的差"""

# (10, 20, 30)

            sum1 = args[0]

for indexin range(1,len(args)):

sum1 -= args[index]

return sum1

return diff

else:

print('暂时不支持这个运算符')

return None

# re是一个函数

re = get_operation('+')

# re(10, 20, 30) - 调用函数获取返回值

print(re(10,20,30))# 60  = 10+20+30

# get_operation('*')  - 这个整体是一个函数

# get_operation('*')(1, 2, 3)  - 调用求乘积的那个函数,并且获取返回值

re = get_operation('*')(1,2,3)

print(re)

# 10 - 20 - 30

print(get_operation('-')(100,20,30))

"""

四、迭代器

1、什么是迭代器(iter)

迭代器是python中的容器类型数据,同时可以存储多个数据。

取迭代器中的数据只能一个一个取,而且取出来的数据,在迭代器中就不存在

2、迭代器中数据的来源

a.将其他数据类型转换成迭代器

b.使用生成式、生成器取产生数据

3、将数据转换成迭代器

所有的序列都可以转换成迭代器

"""

# 将字符串转换成迭代器

iter1 =iter('abcd')

print(iter1)

iter2 =iter([1,10,100,1000])

print(iter2)

iter3 =iter({'name':'小明','age':20})

print(iter3)

"""

4、获取迭代器中的元素

a.

next(迭代器)/迭代器next() - 取出迭代器中第一个元素(已经去出来的元素再也会不到迭代器中了)

"""

iter1 =iter('abcd')

print(iter1)

print(next(iter1))

print(next(iter1))

print(next(iter1))

print(next(iter1))

# print(next(iter1))  # 当迭代器是空的时候,使用next获取元素,会出现StopIteration异常

print(iter2.__next__())

print(next(iter2))

# b.通过for循环取出迭代器中每个元素

for xin iter2:

print('==:', x)

# print(next(iter2))  # 出现异常StopIteration,因为for循环已经将这个迭代器中的元素取完了

"""

四、生成器

1、什么是生成器

迭代器就是生成器;迭代器不一定是生成器

调用带有yield关键字的函数,拿到的结果就是一个生成器。生成器中元素就是yield关键字后面的值。

2、生成器怎么产生数据

只要函数种有yield关键字,调用函数不会再执行函数体获取返回值,而是创建一个生成器。

当获取生成器的元素的时候,才会执行函数的函数体,执行到yield语句为止,

并且将yield后面的值作为结果返回;并且保存当前执行的位置。

获取下一个元素的时候,就从上次结束的位置接着往下去执行函数,直到函数结束或者遇到yield为止;

如果遇到yield就将yield后面的值作为结果返回,并且保存当前执行的位置。

如果函数结束了,就出现StopIteration异常。

生成器对应的函数,执行完成遇到yield的次数,决定了生成器能产生的数据的个数

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

推荐阅读更多精彩内容

  • 一、快捷键 ctr+b 执行ctr+/ 单行注释ctr+c ...
    o_8319阅读 5,780评论 2 16
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,730评论 0 8
  • 8月22日-----字符串相关 2-3 个性化消息: 将用户的姓名存到一个变量中,并向该用户显示一条消息。显示的消...
    future_d180阅读 957评论 0 1
  • 包(lib)、模块(module) 在Python中,存在包和模块两个常见概念。 模块:编写Python代码的py...
    清清子衿木子水心阅读 3,799评论 0 27
  • 一、recode ---------# import randomfrom random import randi...
    大漠判官1阅读 394评论 0 1