python开发10

今日内容:

全局变量和局部变量

函数的嵌套定义

gobalnonlocal语句

lambda  表达式

 

局部变量:

1.定义在函数内部的变量称为局部变量(函数的形参也是局部变量)

2.局部变量只能在函数内部使用

3.局部变量在函数调用时才能够被创建,在函数调用结束之后会自动销毁

全局变量:

1.定义在函数外部,模块内部的变量称为全局变量

2.所有的函数都可以直接访问全部变量,但函数内部不能直接通过赋值土局来来改变全部变量

 

示例:

# a = 100

# b = 200

 

# def fx(c):

#     print('hello')

#     d = 400

#     a = 10#次赋值语句在函数,他只能创建局部变量,不能改变全局变量

#     print(a,b,c,d,sep=' =>')

 

# print('a=',a,'b=',b)

# fx (300)

# print('a=',a,'b=',b)

# #print(c) #局部变量只能在函数内部使用

结果为:

a= 100 b= 200

hello

10 =>200 =>300 =>400

a= 100 b= 200

 

局部变量说明:

1. 在函数内首次对变量赋值是创建局部变量,再次为变量赋值是修改局部变量的绑定关系

2. 在函数内部的赋值语句不能对全局变量造成影响

3. 局部变量只能在其被声明的函数内部访问,而全局变量可以在整个模块同访问

 

练习:

创建一个全局变量:

L = []

写一个函数:

def   input_number()

读入正整数 放在L列表内

input_number()     #输入123

printL#  [ 123]

input_number()     #输入4,5

printL#  [ 1,2,3,4,5]

答案:

# L = []

# def input_number():

#     s = []

#     while True:

#         a = int(input('请输入一个正整数:')or"-1")

#         if a < 0:

#             break

#         s.append(a)

#     #走到此时,s里本次函数调用时用户输入的正整数

#     return s

 

# L += input_number()

# print(L)

# L += input_number()

# print(L)

结果:

请输入一个正整数:1

请输入一个正整数:2

请输入一个正整数:3

请输入一个正整数:4

请输入一个正整数:5

请输入一个正整数:-1

[1, 2, 3, 4, 5]

请输入一个正整数:6

请输入一个正整数:7

请输入一个正整数:8

请输入一个正整数:9

请输入一个正整数:10

请输入一个正整数:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

 

globals()函数和locals函数

globals() 返回当前全局作用域内变量的字典

locals() 返回当前局部作用域内变量的字典

 

示例:

# a = 1

# b = 2

# c = 3

# def fx(c,d):

#     e = 300

#     print('locals()返回=',locals())

#     print('globals()返回=',globals())

#     print(c) #100

#     print(globals()['c']) #3

 

# fx (100,200)

 

 

结果

 

locals()返回= {'e': 300, 'c': 100, 'd': 200}

globals()返回= {'__package__': None, '__spec__': None, 'c': 3, '__cached__': None, '__doc__': None, '__file__': 'jbbl.py', 'a': 1, 'fx': , '__builtins__': , '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7fbfd5be26d8>, 'b': 2, '__name__': '__main__'}

100

3

 

 

函数变量

函数名是变量,它在创建时绑定一个函数

示例:

# def f1():

#     print('hello f1')

# def f2():

#     print('hello f2')

# fx = f1  #注意此处f1没有加()

# fx()

# f1()

# f1 = f2  #f1改变绑定关系,去绑定f2

# f1()     #调用f2

# f2 = fx

# f2()     #调用f1交换法,

结果

hello f1

hello f1

hello f2

hello f1

一个函数可以作为另一个函数实参传递

实例:

def f1():

print(‘f1被调用’)

def f2():

print(‘f2被调用’)

def fx(fn):

print(‘fn绑定的是:’,fn)

fn()#调用fn绑定的函数,此处调用谁就在传过来的是谁

fx (f1)

fx (f2)

 

函数调用

  def myinput(fn):

      L = []

      while True:

          x = int(input("请输入大于0的整数:") or '-1')

          if x < 0:

              break

          L.append(x)

      return fn(L)  # <<< 注意此处

 

  print(myinput(max))

  print(myinput(min))

  print(myinput(sum))

 

 

函数作为另一个函数的返回值

示例:

# def get_op():

#     s = input('输入您要做的操作:')

#     if s == '求最大':

#         return max

#     elif s == '求最小':

#         return min

#     elif s == '求和':

#         return sum

    

# l = [1,2,3,4]

# fx = get_op()

# print(fx(l))

结果

输入您要做的操作:求最大

4

 

输入您要做的操作:求和

10

输入您要做的操作:求最小

1

 

函数的嵌套定义

函数嵌套定义是指一个函数里用def

语句来创建其它函数情况

实例:

def fun_outer():

    print('fun_outer被调用...')

    # 在此处创建另一个函数,并在下面调用

    def fun_inner():

        print('fun_inner被调用')

    fun_inner()  #调用一次

    fun_inner()#调用二次

    print('fun_outer调用结束')

 

fun_outer()#调用函数

结果:

fun_outer被调用...

fun_inner被调用

fun_inner被调用

fun_outer调用结束

如果想要调用内部的函数fun_inner怎么调用呢?

答:在print(调用结束后)加

return fun_inner

就能实现调用

 

Python的作用域

作用域也叫命字空间,是访问变量时找变量名的范围空间

Python的四个作用域  LEGB

作用域   英文解释       英文简写

局部作用域(函数内)    Localfunction            L

外部嵌套函数作用域  Enclosing function  locals         E

函数定义所在模块(文件)的作用域 GlobalsmoduleG

Python 内置模块的作用域          Builtin(python) B

示例:

 

    # v = 100

    # def fun1():

    #     v = 200

    #     print('fun1.v = ',v)

    #     def fun2():

    #         v = 300

    #         print('fun2.v =',v)

    #     fun2()

 

    # fun1()

    # print('全局的v=',v)

结果

fun1.v =  200

fun2.v = 300

全局的v= 100

 

变量名的查找规则:

在访问变量时先查找本地变量,然后是包裹此函数外部的函数内部的变量,之后是全局变量,最后是内置(内建)变量

L -->>  E --->> G --->>  B

2.在默认情况下,变量名赋值会创建或改变本地作用域变量

 

 

问题:

V = 10

Def change_v(a)

V = a #请问能修改全局的v吗?

Changw_v200

 

Global 语句

作用:

告诉解释器,global语句声明的一个或多个变量,这些变量的作用域为模块的作用域(也成全局变量)

2.全局声明(global

将赋值的变量映像到模块文件内部的作用域

语法:

Global 变量1,变量2

示例:

Global v,a,b,c

Global d

示例:

# v = 100

# def fn():

#     #添加全局声明,告诉解释执行器,本函数内的v

#     global v

#     v = 200#本意i想要修改全局变量v让他绑定200

# fn()

# print('v = ',v)

结果:

v =  100

v =  200

 

global说明

1. 全局变量如果要在函数内部被赋值,则必须经过全局声明(否则会被认为是局部变量)

2. 全局变量在函数内部不经过声明就可以直接访问

3. 不能先创建局部变量,再用global声明为全局变量,此做法不符合规则

4. Global变量列表里的变量名不能出现在此作用域内形参列表里

 

练习:

写一个函数

def helloname):

count = 0

hello(‘小张’)

hello(‘小李’)

print(‘函数hello已经被调用%d次’%count#2

hello(‘小赵’)

print(‘函数hello已经被调用%d次’%count#3

答案:

# def hello(name):

#     print(name)

#     global count  

#     count += 1

# count = 0   

# hello('小张')

# hello('小李')

# print('函数hello已经被调用%d'%count)#2

# hello('小赵')

# print('函数hello已经被调用%d'%count)#3

结果

小张

小李

函数hello已经被调用2

小赵

函数hello已经被调用3

 

Noulocal 语句

 作用:

告诉解释器,noulocal声明的变量不是局部变量,也不是全局变量,而是外部嵌套函数内的变量

Nonlocal的语法

示例:

# var = 100

# def f1():

#     car = 200

#     print('f1里的var=',var)

#     print('f1调用结束时var=',var)

#     def f2():

#         global var

#         var = 300

 

#     f2()

#     print('f1调用结束时var=',var)

# f1()

# print('全局的var=',var)

结果:

f1里的var= 100

f1调用结束时var= 100

f1调用结束时var= 100

全局的var= 100

f1里的var= 100

f1调用结束时var= 100

f1调用结束时var= 300

全局的var= 300

 

说明:

1.nonlocal 语句只能在被嵌套的函数内部进行使用

2.访问nonlocal变量将对外部嵌套函数作用域内的变量进行操作

3.当有两层或两层以上函数嵌套时,访问nonlocal变量只对最近一层的变量进行操作

4.nonlocal语句的变量列表里的变量名,不能出现在此函数参数列表中。

问题:

 请问def’语句干什么用?

 

Lambda 表达式(又称匿名函数)

作用:

创建一个匿名函数对象

def类似,但不提供函数名

语法格式:

Lambda[形参1,形参2…]:表达式

示例:

# def myadd(a,b):

#     return a+b

myadd = lambda a,b : a+b

print('10+20=',myadd(10,20))

print('30+40=',myadd(30,40))

结果:

10+20= 30

30+40= 70

语法说明:

1.Lambda只是一个表达式,他用来创建一个函数对象当2.lambda表达式调用时,先执行冒号(:)后的表达式,并返回表达式的结果的引用

3.lambda 表达式创建的函数只能包含一条表达式

4.lambda 比函数简单而且可以随时创建和销毁,有利于减少程序的耦合度

 

练习:

1. 写一个lambda表达式,判断这个数的2次方+1是否能被5整除,如果能被整除返回True,否则返回False

Fx = lambda  n………

Print(fx(3))  #True

Print(fx(4))  #False

 

2. 写一个lambda表达式求两个变量的最大值

Def mymaxxy):

…………

Mymax = lambda …………..

解:

#1

fx = lambda s :((s**2)+1)%5 == 0

# print(fx(3))  #True

# print(fx(4))  #False

结果:

True

False

#2

Printmymax100,200))  #200

    

# mymax = lambda a,b : max(a,b)

# print('最大为:',mymax(100,200))

结果:

最大为: 200

 

 

 

练习:

1. 写一个函数mysum(n)来计算

1+2+3+4+…………….n的和

(要求用函数来做)

Def mysum(n):

………..

Print(mysum(100))   #5050

2. 写一个函数myfac 来计算n!(n的阶乘)

n= 1*2*3*4…*n

def myfac(n):

……….

Print(myfac(5))  #120

3. 给出一个数n,写出一个函数计算:

1+2**2+3**3+4**4+………….+n***n的和

n给个小点的数)

4. 修改之前的学生信息管理项目为项目添加菜单界面

+----------------------------------------------+

|      1)添加学生信息       |

|      2)显示学生信息       |

|      3)删除学生信息       |

|      4)修改学生信息       |

|      5)退出程序           |

+-------------------------------------------+  

请选择:

(要求,每个功能至少对应一个函数)

答案

#1

# def mysum(n):

#     a = 0

#     for x in range(1,n+1):

#         a += x

#     return a

# print('最终n(100)的和为:',mysum(100))

#2

# def myfac(n):

#     a = 1

#     for l in range(1,n+1):

#         a *= l

 

#     return a

# print("5的阶乘是:",myfac(5))

 

# def myfac(n):

#     a = 1

#     i = 1

#     while i <= n:

#         a=a*i

#         i=i+1

      

#     return a

# print ("6的阶乘是:",myfac(6))

#3

# def myaes(n):

#     a = 0

#     for x in range(1,n+1):

#         a += x ** x

#     return a

# print('最终n**n(3)的和为:',myaes(3))

 

#4

 

 

def input_student():

    '''此函数返回用户输入的学生信息的列表

    返回的列表格式写之前完全相同

    '''

    L = []  # 创建一个列表,用来保存所有学生的字典

    # 读取学生数据放入列表中

    while True:

        n = input("请输入学生姓名: ")

        if not n:  # 如果学生姓名为空则结束输入

            break

        a = int(input("请输入学生年龄: "))

        s = int(input("请输入学生成绩: "))

        # 把上述n, a, s 所表示的信息形成字典,并加入到列表

        d = {}  # 创建一个新字典,准备存入学生信息数据

        d['name'] = n

        d['age'] = a

        d['score'] = s

        L.append(d)  # 把字典存入列表中

    return L

 

def output_student(L):

    '''此函数把传入的列表L 打印成为表格'''

    # 第二步,显示所有学生的信息

    print("+---------------+----------+----------+")

    print("|      name     |    age   |  score   |")

    print("+---------------+----------+----------+")

    # 此处打印所有学生的信息

    for d in L:  # 把每个学生的数据取出来,用d绑定对应的字典

        center_name = d['name'].center(15)

        str_age = str(d['age'])  # 先将年龄转为字符串

        center_age = str_age.center(10) # 生成居中的字符串

        center_score = str(d['score']).center(10)

        line = "|%s|%s|%s|" % (center_name,

                              center_age,

                              center_score)

        print(line)

    print("+---------------+----------+----------+")

 

 

def del_student(L):  # 删除学生信息

    name = input("请输入要删除学生的姓名: ")

    print('删除成功')

 

def modify_student_score(L):  # 删除学生信息

    name = input("请输入要修改学生的姓名:")

    # 查找name 是不是在列表L

    # 如果nameL

    score = int(input("请输入要修改的成绩: "))

    # ...

 

def show_menu():

    print("+-----------------------------+")

    print("| 1)  添加学生信息       |")

    print("| 2)  显示学生信息       |")

    print("| 3)  删除学生信息       |")

    print("| 4)  修改学生成绩       |")

    print("| q)  退出程序        |")

    print("+-----------------------------+")

 

def show_menu():

    print("+-----------------------------+")

    print("| 1)  添加学生信息       |")

    print("| 2)  显示学生信息       |")

    print("| 3)  删除学生信息       |")

    print("| 4)  修改学生成绩       |")

    print("| q)  退出程序         |")

    print("+-----------------------------+")

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部