今天学习内容有函数的返回值、函数参数的使用、名称空间与作用域、函数嵌套。

下来我们一一查看。

函数的返回值

看几个栗子:

def func(x):
return x**
y=func()
print(y)
def foo():
return None res=foo()
print(res)
def foo():
return{'a':}
res=foo()
print(res['a'])
def foo():
return {'a':},,'a',[,] res=foo()
print(res) 结果:({'a': 1}, 1, 'a', [1, 2])
def foo():
return
print('======>')
return
return
return print(foo())
结果:1

下面我们来总结一下返回值的效果:

'''
返回值:可以返回任意类型
没有return:默认返回None
return value: value
return val1,val2,val3 :(val1,val2,val3)   返回元祖类型

return的效果:只能返回一次值,终止函数的执行
'''

函数参数的使用

def foo(x):
print(x) foo()
foo('a')
foo({'a':})
结果:
1
a
{'a': 2}
#形参与实参:
def foo(x,y):
return x+y print(foo(,))
结果:3

位置参数:按照从左到右的顺序依次定义的参数

  • 按位置定义的形参,必须被传值,多一个不行,少一个也不行
  • 按位置定义的实参,与形参一一对应

关键字参数:实参在定义时,按照key=value形式定义

  • #关键字参数可以不用像位置实参一样与形参一一对应,指名道姓地传值
def foo(x,y):
print(x)
print(y) foo(y=,x=)
结果:
def foo(x,y,z):
print(x)
print(y)
print(z)
foo(,y=,z=)
结果:
  • 注意的问题一:位置实参必须在关键字实参的前面
  • 注意的问题二:实参的形式既可以用位置实参又可以是关键字实参,但是一个形参不能重复传值

默认参数:在定义函数阶段,就已经为形参赋值,定义阶段有值,调用阶段可以不用传值

def func(x,y=):
print(x)
print(y) func(,)
func()
结果:
  • 默认参数需要注意的问题一:必须放在位置形参后面
  • 默认参数需要注意的问题二:默认参数通常要定义成不可变类型
  • 默认参数需要注意的问题三:默认参数只在定义阶段被赋值一次

形参的应用:值经常变化的需要定义成位置形参

值大多数情况下都一样,需要定义成默认参数

可变长参数:可变长指的是实参的个数不固定

  • 按位置定义的可变长度的实参:*
  • 按关键字定义的可变长度的实参:**
def func(x,y,*args): #x=,y=,args=(,,,)
print(x,y)
print(args) func(,,,,,)
结果: (, , , )
def func(x,y,*args):  #args=(,,,)
print(x,y)
print(args) func(,,*(,,,)) #foo(,,,,,)
结果: (, , , )
def func(x,y,**kwargs): #x=,y=,kwargs={'a':,'b':,'z':}
print(x,y)
print(kwargs) func(,y=,z=,a=,b=)
结果: {'z': , 'a': , 'b': }
def func(x,y=,z=):
print(x,y,z) func(**{'y':,'x':,'z':})
结果:
def wrapper(*args,**kwargs): #可以接受任意形式,任意长度的参数
print(args)
print(kwargs) wrapper(,,,,,,,x=,y=,z=)

命名关键字参数:定义在*后的形参,这类形参,必须被传值,而且要求实参必须是以关键字的形式来传值

def register(name,age,*,group,**kwargs):
print(name)
print(age)
print(kwargs)
print(group)
register('egon',,group='group1',hobby='play')
结果:
egon {'hobby': 'play'}
group1
def register(**kwargs):
print(kwargs)
if 'name' in kwargs:
print(kwargs['name'])
if 'age' in kwargs:
print(kwargs['age'])
register(name='egon',age=)
register()
结果:
{'name': 'egon', 'age': }
egon {}
def register(*args,name='egon',age):
print(args)
print(name)
print(age)
register(name='alex',age=)
register(,,,,age=)
结果:
()
alex (, , , )
egon

引用形参顺序:位置形参,默认参数,*args,命名关键字参数,**kwargs

名称空间与作用域

名称空间:存放名字与值的绑定关系

名称空间分为三种:

  • 内置名称空间:python解释器自带的名字,python解释器启动就会生成
  • 全局名称空间:文件级别定义的名字都会存放与全局名称空间,执行python文件时会产生
x=1
def func():
pass class Foo:
pass import os if 1 > 2 :
y=
  • 局部名称空间:定义在函数内部的名字,局部名称空间只有在调用函数时才会生效,函数调用结束则失效

三者的加载顺序:内置名称空间->全局名称空间->局部名称空间

取值:局部名称空间->全局名称空间->内置名称空间

max=
def func():
max=
print(max)
func()
结果:
max=10
def func():
# max=20
print(max) func() 结果:
10
x=
def f1():
x=
def f2():
x=
def f3():
x=
print(x)
f3()
f2() f1()
结果:

作用域:作用范围

全局作用域:内置名称空间与全局名称空间的名字属于全局范围,在整个文件的任意位置都能被引用,全局有效
局部作用域:局部名称空间的名字属于局部范围,只在函数内部可以被引用,局部有效

x=
def foo():
def f2():
print(x)
f2()
def bar():
print(x) foo()
bar()
结果:
def f1():
x=
def f2():
x=
print(x)
f2()
f1()
结果:

函数嵌套

函数的嵌套调用

def max2(x,y):
if x > y:
return x
else:
return y def max4(a,b,c,d):
res1=max2(a,b)
res2=max2(res1,c)
res3=max2(res2,d)
return res3 print(max4(,,-,))
结果:

函数的嵌套定义

def f1():
def f2():
def f3():
print('from f3')
print('from f2')
f3()
print('from f1')
f2()
# print(f1)
f1()
结果:
from f1
from f2
from f3

函数对象

函数是第一类对象: 指的是函数可以被当做数据传递

def func():
print('from func') #可被引用
# f=func

#可以当做函数的参数

def func():
print('from func')
def foo(x):
print(x)
x() foo(func)
结果:
C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exe C:/Users/Administrator/PycharmProjects/untitled/课堂练习.py
<function func at 0x00000000005D3E18>
from func Process finished with exit code

#可以当做函数的返回值

def foo():
print('from foo')
def bar():
return foo
f=bar()
print(f)
print(foo)
结果:
C:\Users\Administrator\AppData\Local\Programs\Python\Python36\python.exe C:/Users/Administrator/PycharmProjects/untitled/课堂练习.py
<function foo at 0x0000000001D73E18>
<function foo at 0x0000000001D73E18> Process finished with exit code
x=
def f1():
x=
def f2():
# x=
print(x)
return f2
f=f1()
# print(f)
f()
结果:

#可以当做容器类型的元素

def select():
print('select function') func_dic={
'select':select,
} # print(func_dic['select'])
func_dic['select']()
结果:
select function

def select():
print('select func') def delete():
print('delete func') def change():
print('change func') def add():
print('add func') while :
cmd=input('>>: ').strip()
if not cmd:
continue
if cmd == 'select':
select()
elif cmd == 'delete':
delete()
elif cmd == 'change':
change()
elif cmd == 'add':
add()
else:
print('无效的命令')

def select(cmd_l):
    filename=cmd_l[-1]
    pattern=cmd_l[1]

with open(filename,'r',encoding='utf-8') as f:
        for line in f:
            if pattern in line:
                print(line)

def delete():
    print('delete func')

def change():
    print('change func')

def add():
    print('add func')

def check():
    print('check func')

func_dic={
    'select':select,
    'delete':delete,
    'change':change,
    'add':add,
    'check':check,
}

while 1:
    inp=input('>>: ').strip()
    if not inp:continue
    cmd_l=inp.split()
    # print(cmd_l)
    cmd=cmd_l[0]
    if cmd in func_dic:
        func_dic[cmd](cmd_l)
    else:
        print('无效的命令')

python--函数的返回值、函数参数的使用、名称空间与作用域、函数嵌套、函数对象的更多相关文章

  1. python之函数名称空间,作用域,嵌套函数

    目录 嵌套函数 定义 名称空间的三大类(只存变量名) 名称空间加载顺序 变量名的查找顺序为 作用域 嵌套函数 定义 函数内部定义的函数,无法在函数外部使用内部定义的函数. def f1(): def ...

  2. Python之函数对象、函数嵌套、名称空间与作用域、闭包函数、装饰器

    目录 一 函数对象 二 函数的嵌套 三 名称空间和作用域 四 闭合函数 五 装饰器 一.函数对象 1.函数是第一类对象 #第一类对象的特性:# 可以被引用 # 可以当做参数传递 # 返回值是函数 # ...

  3. 终于懂了:Delphi消息的Result域出现的原因——要代替回调函数的返回值!(MakeObjectInstance不会帮助处理(接收)消息回调函数的返回值)

    MakeObjectInstance应该不会帮助处理(接收)消息回调函数的返回值,可是有时候又确实需要这个返回值,这可怎么办呢?我是看到这段文字的时候,想到这个问题的: 当WM_PAINT不是由Inv ...

  4. python--函数、参数、名称空间与作用域、匿名函数、内置函数、闭包

    python函数 函数定义 def welcome(): print('hello world!!') welcome() #函数调用 ...运行结果 hello world!! 函数定义和编写原则: ...

  5. Python——day11 函数(对象、名称空间、作用域、嵌套、闭包)

    一.函数对象  函数名就是存放了函数的内存地址,存放了内存地址的变量都是对象,即 函数名 就是 函数对象  函数对象的应用 1. 可以直接被引用  fn = cp_fn 2 .可以当作函数参数传递 c ...

  6. 10-Python入门学习-函数的对象与嵌套、名称空间与作用域、闭包函数

    一.函数的对象 函数是第一类对象,指的是函数名指向的值(函数)可以被当作数据去使用 def func():# func=函数的内地址 print('from func') print(func) ag ...

  7. day11---函数对象、名称空间、作用域、闭包函数

    一.函数对象: 定义:函数对象就是函数名,函数名就是存放了函数的内存地址,存放了内存地址的变量就是对象 函数对象的应用: 可以直接被引用:(fn = cp_fn) 可以当做参数传递传递: comput ...

  8. day4_python之名称空间与作用域、闭包函数、嵌套函数

    一.名称空间与作用域 名称空间:存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的地方 内置名称空间:在python解释器启动时产生,存放一些python内置的名字 全局名称空间:在执行文件 ...

  9. PYTHON-函数对象,嵌套,名称空间与作用域,闭包函数

    一 函数是第一类对象,即函数可以当作数据传递 1 可以被引用 2 可以当作参数传递 3 返回值可以是函数 3 可以当作容器类型的元素 def foo(): return len f = foo pri ...

随机推荐

  1. 如何在pycharm中进入shell脚本调试代码

    首先在Teramal终端 输入python manage.py shell 然后进行下图操作来调试代码

  2. 生成100个 "20180520" 这样的时间字符串 写入txt文件

    主要想记录一下 . 写NSString 到txt . 数组的去重 . 数组的截取 . 数组分割 代码如下: NSString *year = @"2018"; NSArray *m ...

  3. Java Web学习总结(1)Tomcat使用教程

    一,简介 Tomcat是一个实现了JAVA EE标准的最小的WEB服务器,是Apache 软件基金会的Jakarta 项目中的一个核心项目,由Apache.Sun 和其他一些公司及个人共同开发而成.因 ...

  4. Python基础教程(013)--一行代码不要做多件事情

    前言 学习代码编写风格 内容 语法错误报错的信息 SystaxErrot:invalid syntax 语法错误, invalid 无效 每行代码负责完成一个动作 阅读代码,从左至右,从上到下. 学习 ...

  5. CoffeeScript编写简单新闻页(仅UI)

    CoffeeScript编写简单新闻页(仅UI) 1. 配置(在公司搭建好的环境下配置) omnisocials-backend/src/backend/modules/member/config/m ...

  6. [CSP-S模拟测试]:Emotional Flutter(贪心)

    题目传送门(内部题51) 输入格式 第一行一个整数$t$表示数据组数.每组数据的第一行有三个整数$s,k,n$.第二行有$n$个整数$A_1,A_2,...,A_n$,依次表示黑白条的长度. 输出格式 ...

  7. html&css面试笔记

    1.CSS选择器有哪些?它们的优先级是怎样的? 选择器类型: id选择器 ( # myid) 类选择器 (.myclassname) 标签选择器 (div, h1, p) 相邻选择器 (h1 + p) ...

  8. Shiro那些事儿(一): Shiro初探

    引言 权限,可以简单的理解成你能干什么,不能干什么.在管理系统中,对权限的设计可以很简单,也可以很复杂.简单点的,基本都是基于角色扮演的方式,比如系统管理员角色可以操作哪些菜单,普通用户角色可以操作哪 ...

  9. Java + selenium 元素定位(5)之By Xpath

    这篇关于Xpath方法的文章和之前那篇CSS的方法一样,使用前,需要先掌握一些Xpath的相关知识.当然,网上也有各种工具可以帮助我们获取到元素的Xpath,但是这并不代表着我们就可以不用了解Xpat ...

  10. 好1.1.4 PTA提交列表及说明

    这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 我在这个课程的目标是 这个作业在那个具体方面帮助我实现目标 概括本周的学习以及更加熟练本周的代码 参考文献 C语言程序设计 百度文献 (h ...