首页 > 其他分享 >Day 11 函数对象 + 函数的嵌套 + 名称空间与作用域

Day 11 函数对象 + 函数的嵌套 + 名称空间与作用域

时间:2024-10-24 22:21:41浏览次数:1  
标签:11 f1 return 函数 形参 作用域 print def

目录

0 昨日复习

0.1 函数

  • 定义阶段:只识别语法,不执行函数体代码
  • 调用阶段:执行函数体代码

0.2 定义

def 函数名():
	代码块

0.3 三种形式的函数

0.3.1 无参函数

def 函数名():
	代码块

0.3.2 有参函数

def 函数名(x,y):
  代码块

0.3.3 空函数

def 函数名():
	pass   #以后再输入

0.4 函数的返回值

返回值是通过return关键字返回的

def 函数名():
	pass  #默认返回none
def self_max(x,y)
	if x > y:
		return x
	else:
		return y

max_num = self_max(10,20)
print(max_num * 2)  # 40
def get_list():
  return [1,2,3],len([1,2,3])
get_list()   #([1,2,3],3)
# 返回多个值的时候,会用元组接收多个值

return 除了返回值的作用,还有终止函数的作用,即不运行return后面的代码,也就是说一个函数可以有多个return,只要遇到第一个return就终止了

0.5 函数的调用

普通的调用:

def f1():
	pass
f1()

调用后做处理:

def self_max(x,y)
	if x > y:
		return x
	else:
		return y

max_num = self_max(10,20)
print(max_num * 2)  # 40

0.6 函数参数的应用

0.6.1 形参

定义阶段的参数叫形参,形参具有描述意义,不是一个具体的值

0.6.2 实参

调用阶段传入的值,是一个具体数据类型的值

0.6.3 位置形参

从左到右放入

0.6.4 位置实参

从左到右与形参一一对应

0.6.5 默认形参

def f1(y,x=1):
  return x+y
z = f1(2)   #y = 2,x = 1
print(z)

一般用于形参经常使用同一个值的时候,默认形参必须在位置形参的后面

0.6.6 关键字实参

def f1(x,y,z):
  return x+y
a = f1(z,y = 2,x = 1)   #y,z = 2,x = 1
print(a)

一般用于参数较多的时候,指定传值,可以打乱顺序传值,关键字实参必须的在位置实参的后面

0.7 可变长参数

0.7.1 *形参

def f1(*args): 
  print(args)  # 以元组的形式输出
  return args		#以元组的形式返回
f1(1,2,3,4)  # 此时数据个数不限

0.7.2 *实参

def f1(x,y,z,u):
  print(f'x:{x},y:{y},z:{z},u:{u}')
args = (1,2,3,4)  #定义一个元组,元组个数必须与形参个数相同才能在下一步用*args当实参
f1(*args) 

0.7.3 **形参

def f1(**kwargs):
  print(kwargs)  #以字典的形势输出 ,kwargs = {'a':1,'b':2,'c':3,'d':4}
f1(a=1,b=2,c=3,d=4)  #此处必须为关键字实参,个数不限

0.7.4 **实参

def f1(a,b,c):
  print(f'a:{a},b:{b},c:{c}')   #输出a:7,b:4,c:2
kwargs = {'b':4,'c':3}
f1(9,**kwargs)

0.7.5 最终

def f1(*args,**kwargs): #这样子定义形参,不论实参怎么输入,函数都能接收到
  print(args,kwargs)
f1(1,2,3,,4,5,x=1,t=9) 

1 函数对象

1.1 引用,赋值

def f1():
    print(123)
a = f1  # 此时a与f1有一样的功能,是一个函数
print(id(f1))   # 输出f1的位置
print(type(f1))  #输出f1的类型,function
a()   # 等价于 f1()
print(a)  # 输出

1.2 当做函数的返回值

def f2():
    return(f1())  #返回的是f1()运行后的结果
    return(f1)  #返回的是f1的内存地址
def f1():
    print(147)

1.3 当作函数的参数

def f2(m):
    m()  #此时要求形参必须是一个函数的名称,不然会报错的吧

def f1():
    print(147)
f2(f1)

1.4 作为容器元素的元素

def f1():
    print(1450) 
list = [1,2,f1]  
list[2]()   #此时list[2]即为f1

1.5 练习

def weixin():
    print("微信支付成功!")
def zhifubao():
    print("支付宝支付成功!")

dict = {'0':weixin,'1':zhifubao,'2':'跑单'}
dict_print = {'0':'weixin','1':'zhifubao','3':'跑单'}
while True:
    print(dict_print)
    choice = input("请选择你的支付方式--->").strip()
    if choice == '0' or choice == '1':
        dict[choice]()

    elif choice == '2':
        print("2b,那你还不快跑!")
    else:
        print('傻逼,看不懂人话?')
    break

2 函数的嵌套

# # 定义阶段只检查语法,不执行代码
def f1():
    def f2():
        print(125)
    f2()
f1()


# 通过输入指令来输出圆的周长和面积  (傻逼采用嵌套)
from math import pi
def circle(r,action):
    if action == 'p':
        def perimeter():
            return 2*pi*r
        res = perimeter()
    elif action == 'a':
        def area():
            return pi*r**2
        res = area()
    else:
        res = '傻逼,输错了'
    return res

r_choice = int(input("请输入半径>>>").strip())
action_choice =input("选择你所需要的功能,计算面积:'p',计算周长:'a'>>>")
res=circle(r_choice,action_choice)
print(res)

3 名称空间与作用域

名称空间:存放名字的空间

3.1 内置名称空间

定义:python自带的(有点像小整数池)

生命周期:python启动的时候就活了,python关闭了就死了

'str'.strip()  # 之前所学的内置方法都是一个个被封装好的函数,被封装后具有了某种功能
list = [1,2,3,4]
len(list)

# len是python的内置方法,python启动的时候,就会定义len函数,并把len丢入到内存空间中去
# 这个内存空间叫做内置名称空间 (有点像小整数池)

3.2 局部名称空间

定义:函数内部的都叫局部,也就是说函数内部定义的名字都放入了局部名称空间中

生命周期:函数运行的时候会活,运行完就死了

def f1():
    def f2():
        pass
    f2()

3.3 全局名称空间

定义:除了内置和局部,剩下的都是全局名称空间

生命周期:程序/文件运行的时候才会活,运行完就死了

3.4 执行顺序和查找顺序

  • 执行顺序:内置名称空间 ---> 全局名称空间 ---> 局部内置空间
  • 查找顺序:从当前名称空间开始查找,然后逐步往上,如果当前为局部,则顺序为 局部--->全局--->内置
x = 1
def f1():
    x = 2
    print(2,x)  # 输出2,2

x = 3
print(1,x)  #输出1,3
f1()

3.5 作用域

  • 全局作用域:适用于全局+内置,也就是全局可以修改内置的,内置的可以修改全局的
  • 局部作用域:只适用于局部范围
  • 作用域关系在函数定义阶段就已经确定了
  • 函数与函数之间可能存在相同的变量名,但他们是毫无关系的,作用域不同
def f1():
    x = 1
    def f2():
        print(1,x)
    return f2
#  f1()  #f2
f2 = f1() #f2()
x = 10
def f3():
    x = 15
    print(2,x)
    f2()
f3()

3.6 global and nonlocal (了解)

# global:局部修改全局
x = 100
def f1():
    global x
    x = 1
    print(1,x)  #输出 1,1
f1()
print(2,x)  # 输出2,1
# nonlocal:把局部改成外部
x = 10
def f1():
    x = 1
    def f2():
        nonlocal x   #声明x是外部,嵌套函数的内部的外部,不能修改全局
        x = 3
    f2()
    print(1,x)
print(2,x)
f1()

标签:11,f1,return,函数,形参,作用域,print,def
From: https://www.cnblogs.com/chsun12/p/18501462

相关文章

  • 10.11日总结
    上午练习了排球,下午上了马原课晚上学习了javaJava收获一.新项目的名字新项目的名字规范命名取为该项目英文名称的首字母。如学生信息管理系统,英文名为Studentsselectcoursesystem,即取名为sscs。二.构建项目框架(设计数据库)如学生选课管理系统,在做系统前需要进行初步设计,有......
  • [Coci2011]kamion 题解
    前言题目链接:Hydro&bzoj;黑暗爆炸。题意简述给你一张\(n\)个点\(m\)条边的有向图。有\(p\)种括号,每条边的边权可以是这\(p\)种括号中某一种的左括号或者右括号,也可以为空。问你有多少条从\(1\)开始到\(n\)的长度小于等于\(k\)的路径,满足括号匹配,或者剩余若干未......
  • 你好,F#! 你好,函数式编程!
    如果你之前只接触过类C(cpp,java,C#等),你可能很难想象一门语言,没有continue和break,也可能从未听说过柯里化,monad等概念,或许也从未想过,编程语言中还会有单位(量纲)的特性支持。没错,如果是第一次接触类似的语言,会感觉情报源源不断的涌入大脑,有可能感到一头雾水。 但不要因此退缩,......
  • 题解:P3012 [USACO11FEB] Cowlphabet G
    [USACO11FEB]CowlphabetG题意有\(P\)种拼接方式,问由\(U\)个大写字母和\(L\)个小写字母合法组合的方案数。输出方案数对\(97654321\)取模的值。思路动态规划,还没有人写逆推方法,刚好我做的逆推。设\(f[i][j][z]\)表示一共有\(i\)个字母,其中\(j\)个为小写字母,......
  • Win11安装基于WSL2的Ubuntu
    1.概述趁着还没有完全忘记,详细记录一下在Win11下安装基于WSL2的Ubuntu的详细过程。不得不说WSL2现在被微软开发的比较强大了,还是很值得安装和使用的,笔者就通过WSL2安装的Ubuntu成功搭建了ROS环境。2.详论2.1子系统安装在Win11搜索栏中搜索“启用或关闭Windows功能”,在弹出......
  • Oracle+11g+笔记(8)-备份与恢复机制
    Oracle+11g+笔记(8)-备份与恢复机制8、备份与恢复机制8.1备份与恢复的方法数据库的备份是对数据库信息的一种操作系统备份。这些信息可能是数据库的物理结构文件,也可能是某一部分数据。在数据库正常运行时,就应该考虑到数据库可能出现故障,而对数据库实施有效的备份,保证......
  • AI预测体彩排3采取888=3策略+和值012路或胆码测试10月24日升级新模型预测第114弹
             经过100多期的测试,当然有很多彩友也一直在观察我每天发的预测结果,得到了一个非常有价值的信息,那就是9码定位的命中率非常高,已到达90%的命中率,这给喜欢打私菜的朋友提供了极高价值的预测结果~当然了,大部分菜友还是走的正常渠道,因此,得想办法进行缩水,尽可能少的......
  • jspm基于Java web的在线餐饮管理系统的设计和实现(11862)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发......
  • [赛记] 多校A层冲刺NOIP2024模拟赛11 && 12
    冒泡排序100pts比较显然的签到题(好久没这么水过了);考虑这个错的冒泡排序,手模一下即可发现这个$+k$有点像以前做过的同余系中求和的问题,于是这个题同理,用set维护每个同余系的排名,最后按顺序输出即可;对于正确性,相当于每次$+k$,则就相当于在一个同余系中排序;时间复杂度:$......
  • 基于Java的高校成绩报送系统的设计与实现(11870)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项......