首页 > 其他分享 >函数/名称空间/作用域/闭包函数/函数对象

函数/名称空间/作用域/闭包函数/函数对象

时间:2023-12-11 21:34:39浏览次数:26  
标签:闭包 return 函数 作用域 res add print def

函数

【一】函数的定义

  • 函数的使用必须遵循先定义,后调用的原则
def 函数名(参数1,参数2,...):
    函数体
    return 返回值
函数名()

(1)空函数

  • 函数体为pass代表什么都不做,称之为空函数
  • 定义空函数通常是有用的,因为在程序设计的开始,往往是先想好程序都需要完成什么功能,然后把所有功能都列举出来用pass充当函数体'占位符'
def login():
	pass # ...

(2)函数定义

[1]无参无返回值的函数

def login():
    username = input('用户名:>>>').strip()
    password = input('密码:>>>').strip()
    if username == 'heart' and password == '123':
        print(f'{username} 登陆成功!')
login() 

[2]有参无返回值的函数

def login(username, password):
        if username == 'heart' and password == '123':
                print(f'{username} 登陆成功!')
login('heart', '123')

[3]多个参数一个返回值

def add(x, y):
    result = x + y
    return result

result = add(1, 1)
print(result)
  • 多个参数多个返回值
def index(x, y):
    return x + y, x * y

res_one, res_two = index(2, 4)
print(res_one)  # 6
print(res_two)  # 8

(3)函数的调用方式

def add(x,y):
    return x+y,x*y

[1]直接调用

def add(x,y):
    return x+y
res = add(4,7)
print(res)

[2]表达式调用

def add(x, y):
    print(x + y)
    return x + y

res = add
res(1, 9)

[3]作为参数

  • 函数的返回值作为参数,给其他函数使用
def multy(j, k):
    return j * k

def add(x, y):
    return x + y

print(multy(add(1, 9), 8))
  • 函数的内存地址可以作为参数给其他函数调用
def add():
    x=1
    y=9
    return x + y

def multy(func, k):
    return func() * k

print(multy(add,6))

[4]间接调用

def add(x,y):
    return x+y,x*y
res = add(4,7)
print(res)

(4)函数的参数类型

[1]形参和实参的介绍

  • 函数的参数分为形参和实参
    • 在定义函数时,定义在函数名后面的(变量名)
      • 形参本质就是一个变量名,用来接受外部传来的值
    • 实参即在调用函数时,括号内传入的值
      • 值可以是常量、变量、表达式或三者的组合
def add(x,y):
    print(x+y)
  • 如果我们想让其他人就传指定的类型的话,可以做一个弱声明
def add(x:int,y):
    print(x)
    print(y)
add('a',9)

[2]位置参数

  • 按位置传参数:必须按照形参变量名的位置传参数
def add(name,age):
    print(f'my name is {name},my age is {age}')

add('heart',18)
  • 按关键字传参数:必须按照形参变量名指定参数传参
def add(name, age):
    print(f'my name is {name},my age is {age}')

add(age=18, name='heart')
  • 关键字参数和位置参数混合使用
    • 位置参数必须在关键字参数前面
def add(name, age, sex):
    print(f'my name is {name},my age is {age},my sex is {sex}')

add('heart', age=18, sex='男')

[3]默认参数

def func(name, age, sex='男'):
    print(f'my name is {name},my age is {age},my sex is {sex}')

func('heart', 18)
func('god', 18, '女')

[4]可变长参数

  • 可变长位置参数:*args
def add(*args, **kwargs):
    print(args)
    print(kwargs)

add(1, 2, 3, 4, 5, name='heart', age='18')# (1, 2, 3, 4, 5) {'name': 'heart', 'age': '18'}
  • 解包
def index(*args):
    print(args)
num_list = [1,2,3,4,5,6]
print(*num_list) # 1 2 3 4 5 6
index(*num_list) # (1,2,3,4,5,6)
  • 可变长关键字参数:**kwargs key:word
def index(**kwargs):
    user_dict = {'name': 'heart'}
    if kwargs:
        user_dict.update(kwargs)
    return user_dict

res = index(age=18)
print(res)
  • 解包 ** 将字典解压成键值传到函数内部
def index(**kwargs):
    user_dict={'name':'heart'}
    if kwargs:
        user_dict.update(kwargs)
    return user_dict

user_data={'age':18,'gender':'男'}
res=index(**user_data)
print(res)

[5]命名关键字参数

  • 在定义形参时,用*作为一个分隔符号,*号之后的形参成为命名关键字参数
    • 对于这类参数,在函数调用时,必须按照key=value的形式为其传值,且必须被传值
def add(name,age,*,sex,height):
    print()
  • 默认参数 --- 如果是命名关键字参数,我的默认参数就可以不区分位置
def add(name,age,*,sex='男',height)
	print()

(5)名称空间

  • 定义变量名和变量值,变量名其实就是指向变量值的引用

[1]内建名称空间

  • 随着python解释器的启动而自动加载的名称空间
print(max([1,2,3]))

[2]全局名称空间

  • 全局名称空间 (内建 + 我们自己定义的)
  • 我们自己的在文件中定义的变量名`/函数名/类名...
name='heart'
import random

[3]局部名称空间

  • 定义在函数内部/定义在类内部加载出来的名称空间
# 内建
print(max([1,2,3]))

# 全局
num =1

# 局部
def add():
	print(num)
  • 局部可以使用全局的变量,全局不能使用局部的变量

[4]名称空间的加载顺序是

  • 内建名称空间 ->全局名称空间 ->局部名称空间
  • 而查找一个变量名,查找顺序为:
  • 局部名称空间->全局名称空间->内置名称空间。

(6)作用域

[1]内置 --- 内建

  • python自带或导入第三方包

[2]全局作用域

a = 2

def index():
    print('这是func1打印的', a)

index()

[3]局部作用域

num =2
print(num)
def outer():
    # 局部修改全局变量需要在函数内部用global声明
    global num
    print(num)
    num += 1
    print(num)
outer()
print(num) # 2 2 3 3 

[4]嵌套作用域

  • nonlocal
def outer():
    # 局部修改全局变量需要在函数内部用global声明
    num_inner =99
    def inner():
        #局部引用内函数 要用nonlocal
        nonlocal num_inner
        num_inner +=99
    inner()
    print(num_inner)
outer()

(7)global和nonlocal

(1)global

  • 如果想要修改全局的不可变数据类型就需要global关键字将内部需要修改的变量名提高成全局的才能生效
is_admin=False
def login():
    global is_admin
    is_admin=True
    print(is_admin)

login()
print(is_admin)

(2)nonlocal

  • 修改外层函数变量
  • 在函数中嵌套函数时,嵌套在里面的函数创建的作用域内一般也是不允许改变外层函数变量
    • 除非是nonlocal关键字声明
	def fun1():
    a = 1

    def fun2():
        nonlocal a
        a += 1
        print(a)

    return fun2

fun2 = fun1()
fun2()

(8)闭包函数

  • 基于函数对象的概念,可以将函数返回到任意为止去调用

  • 闭包函数就是内嵌函数包含对外部函数作用域(而非全局作用域)中变量的引用

  • 无论是在何处调用闭包函数,使用的仍然是包裹在其外层的变量

x = 1

def outer():
    x = 2

    def inner():
        print(x)

    return inner

func = outer()
func()

(9)函数对象

  • 函数对象指的是函数可以被当做数据来处理,,具体可以分为四个方面的使用

[1]函数可以被引用

def add(x, y):
    return x + y


func = add
res = func(1, 2)
print(res) # 3

[2]函数可以作为容器类型的元素

def add(x, y):
    return x + y


dic = {'add': add, 'max': max}
res = dic['add'](1, 2)
print(res)

[3]函数可以作为参数传入另外一个参数

def add(x, y):
    return x + y


def foo(x, y, func):
    return func(x, y)


res = foo(1, 2, add)
print(res)

[4]函数的返回值可以是一个函数

def add(x, y):
    return x + y


def bar():
    return add


func = bar()
res = func(1, 2)
print(res)

标签:闭包,return,函数,作用域,res,add,print,def
From: https://www.cnblogs.com/ssrheart/p/17895597.html

相关文章

  • 无涯教程-MFC - Combo Boxes函数
    组合框由与静态控件或编辑控件组合的列表框组成,控件的列表框部分可能始终显示,或者仅在用户选择控件旁边的下拉箭头时才下拉。这是Combobox控件的消息映射列表-MessageMapentry描述CBN_DBLCLKON_CBN_DBLCLK(<id>,<memberFxn>)用户在组合框的列表框中双击一个字符串。C......
  • 无涯教程-MFC - List Box函数
    列表框显示用户可以查看和选择的项目列表,例如文件名,列表框由CListBox类表示,在单选列表框中,用户只能选择一项,在多选列表框中,可以选择一系列项目,当用户选择一个项目时,该项目将突出显示,并且列表框会将通知消息发送到父窗口。这是列表框的一些映射条目MessageMapentry描述LBN_......
  • 无涯教程-MFC - Command Button函数
    命令按钮是常规按钮的增强版本,它在左侧显示一个绿色箭头图标,后跟一个常规尺寸的标题,在主标题下,它可以显示另一个较小的标题,作为提示以提供更多信息。这是命令按钮控件的消息映射列表-MessageMapentry描述BN_CLICKEDON_BN_CLICKED(<id>,<memberFxn>)单击按钮时,框架将调......
  • 聚合函数及分组过滤
    --聚合函数--能够统计表中数据(想查询一个表中有多少个记录,就使用这个count())SELECTCOUNT(`pid`)FROM`category`;--count(字段),会忽略所有的null值SELECTCOUNT(*)FROM`category`;--不会忽略null值,与count(1)本质一样,是计算行数SELECTCOUNT(1)FROM`category`;SELECTS......
  • 无涯教程-MFC - Static Text函数
    静态控件显示文本字符串,框,矩形,图标,光标,位图或增强型图元文件,它由CStatic类表示,它可用于标签,框或分离其他控件,静态控件通常不接受输入,也不提供输出。这是CStatic类中的方法列表-Sr.No.Name&描述1Create创建Windowsstatic控件并将其附加到CStatic对象。2DrawItem......
  • 【python基础之命名空间与作用域】---命名空间与作用域
    title:【python基础之命名空间与作用域】---命名空间与作用域date:2023-12-1118:44:060updated:2023-12-1118:44:00description:cover:https://home.cnblogs.com/u/dream-ze/【一】名称空间与闭包【1】什么是名称空间名称空间即存放名字与对象映射/绑......
  • 2.chart函数及流程控制
    1.chart内置对象1.1什么是内置对象1.2创建chart模板1.3内置对象chart1.4内置对象Release1.5内置对象values1.6内置对象Capabilities2.chart函数与管道2.1函数介绍2.2函数管道3.Chart常用函数3.1default函数3.2quote函数3.3required函数3.4include函......
  • 【虹科干货】触发器和函数:让代码更接近数据
    文章速览:触发器和函数的基础知识编写语言:从Lua到JavaScript轻松维护应用程序代码数据库事件实时处理如何操作触发器和函数一般来说,应用程序处理业务的逻辑,是将执行代码发送到数据库。因此每次执行函数时,代码都会从客户端流入服务器,结果就是这个过程十分缓慢,甚至会出现代码......
  • 自定义一个函数供后续方便使用
    在bash配置文件(通常是.bashrc或.bash_profile等)中定义一个名为reloadctl的函数:最终实际执行的是(全局生效):vi/etc/profile 1reloadctl(){2if["$#"-ne2];then3echo"Usage:hehe-n<service_name>"4return15fi67......
  • 无涯教程-MFC - Bitmap Button函数
    位图按钮在其脸上显示图片或图片和文本,这通常是为了使按钮略显,使用从CButton派生的CBitmapButton类创建位图按钮。这是CBitmapButton类中的方法的列表。Sr.No.Name&描述1AutoLoad将对话框中的按钮与CBitmapButton类的对象相关联,按名称加载位图,并调整按钮的大小以适合位......