函数总结

# 函数的定义:
def func(a, b):
   print(a, b)
   return a + b


# 函数四个组成部分
# 函数名:调用函数的依据,必须的
# 函数体:执行函数逻辑的,必须的
# 参数列表:为函数内部提供资源,非必须的
# 返回值:将函数执行结果返回给外界,(非必须的)

# 返回值:空返回(没有return|空return) | 一值返回 | 多值返回:装有多个值的元组

# 参数列表:
# 实参:外界调用函数传入的参数,拥有实际值
# 形参:函数定义时,()中定义用来接受实参的值

# 参数重点一:形参是对实参的值拷贝 *****
ls = [1, 2, 3, 4, 5]
num = 10


def fn(arg, n):
   arg[2] = 300
   print('1:', arg[2])
   print(id(n))
   n = 100
   print(id(n))


fn(ls, num)
# arg是对ls的值拷贝
print('2:', ls[2])
print(id(num))


# 实参的分类
# 位置实参:按位置对应传递参数,必须出现在关键字实参之前
# 关键字实参:不需要按位置对应传参,用参数名标注为谁传参,必须出现在位置实参之后

# 参数重点二:先位置实参后关键字实参传参

# 参数重点三:
# 位置实参:只能给位置形参传参(位置形参|默认形参|可变长位置形参)
# 关键字实参:可以给任意形参传参

# 出现顺序
# 参数重点四:
# 位置形参 > 默认形参 > 可变长位置形参 > 关键字形参 > 可变长关键字形参

def fn1(a, b, c=10, *args, d, e=20, f, **kwargs):
   pass


函数对象

# 函数名就是存放了函数的内存地址,存放了内存地址的变量都是对象,即 函数名 就是 函数对象

# 函数对象的应用
# 1 可以直接被引用 fn = cp_fn
# 2 可以当作函数参数传递 computed(cp_fn, 100, 20)
# 3 可以作为函数的返回值 get_cp_fn(cmd): return add
# 4 可以作为容器类型的元素 method_map: 对应关系中的值
def add(a, b):
   return a + b
def low(a, b):
   return a - b
def jump(a, b):
   return a * b
def full(a, b):
   return a / b
def quyu(a, b):
   return a % b
def computed(fn, n1, n2):
   res = fn(n1, n2)
   return res
method_map = {
   'add': add,
   'low': low,
   'jump': jump,
   'full': full,
   'quyu': quyu,
}
# 根据指令获取计算方法
def get_cp_fn(cmd):
   if cmd in method_map:
       return method_map[cmd]
   return add  # 输入有误用默认方法处理


while True:
   cmd = input('cmd: ')
   if cmd == 'quit':
       break
   cp_fn = get_cp_fn(cmd)
   result = computed(cp_fn, 100, 20)
   print(result)

名称空间

# 名称空间:存放名字与内存空间地址对应关系的容器
# 作用:解决由于名字有限,导致名字重复发送冲突的问题

# 三种名称空间
# Built-in:内置名称空间;系统级,一个;随解释器执行而产生,解释器停止而销毁
# Global:全局名称空间;文件级,多个;随所属文件加载而产生,文件运行完毕而销毁
# Local:局部名称空间;函数级,多个;随所属函数执行而产生,函数执行完毕而销毁

# 注:
# del 名字:可以移除查找最近的名字与内存空间地址的对应关系
# 加载顺序:Built-in > Global > Local

global关键词

def fn()
global num
   num = 20
   print(num)
# global关键词可以将Local的名字提升为Global的名字
# 一个文件中的Global名字就是一个,所以函数内部外部使用的名字都是一个
fn()  # 注:一定要调用函数,才能产生名字,并提升
print(num)

函数的嵌套定义

# 将函数直接定义到另一个函数内部,就可以使用外部函数的中的名字
def outer():
   num = 20
   def inner():
       print(num)  # inner就可以直接使用outer中的名字
   inner()
outer()

作用域

# 作用域:名字起作用的范围
# 作用:解决同名字可以共存问题

# 四种作用域
# Built-in:内置作用域,所有文件所有函数
# Global:全局作用域,当前文件所有函数
# Enclosing:嵌套作用域,当前函数与当前函数的内部函数
# Local:局部作用域,当前函数

# 注:
# 不同作用域之间名字不冲突,以达到名字的重用
# 查找顺序:Local > Enclosing > Global > Built-in
len = 10
def outer():
   len = 20  # 外层函数的局部变量:Enclosing - 嵌套作用域
   def inner():
       len = 30
       print('1:', len)  # 30, inner -> outer -> global -> built-in
   inner()
   print('2:', len)  # 20, outer -> global -> built-in
outer()
print('3:', len)  # 10, global -> built-in

del len
print('4:', len)  # len地址, built-in

闭包

# closure:被包裹的函数,称之为闭包
# 完整的闭包结构:1.将函数进行闭包处理;2.提升函数名的作用域,将内部函数对象作为外部函数的返回值

def outer(url):
   def get_html():
       html = requests.get(url)
       print(html.text)
   return get_html
# 先预定义多个爬虫方法,爬页面操作并未执行
baidu = outer('https://www.baidu.com')
python = outer('https://www.python.org')
sina = outer('https://www.sina.com.cn')
# 什么时候想爬什么页面就调用指定页面的爬虫方法
baidu()
sina()
baidu()

Day 11 函数对象,函数嵌套,作用域,闭包的更多相关文章

  1. 【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】

    一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(Firs ...

  2. 周末学习笔记——day01(函数,函数对象,嵌套调用,名称空间,作用域,闭包,装饰器)

    一,复习 字符编码 文件头:py2—ASCII,py3—UTF-8 三种字符串:u' ' b ' ' r ' ' u' ' .endcode(' utf-8 ') b' '.deconde(' utf ...

  3. Python 函数对象-函数嵌套-名称空间与作用域-闭包函数

    今日内容: 1. 函数对象 函数是第一类对象: 指的是函数名指向的值可以被当中数据去使用 1.可以被引用 2.可以当做参数传给另一个函数 3.可以当做一个函数的返回值 4.可以当做容器类型的元素 2. ...

  4. python函数:函数参数、对象、嵌套、闭包与名称空间、作用域

    今天的内容整理共有5部分 一.命名关键字参数 二.函数对象 三.函数的嵌套 四.名称空间与作用域 五.闭包函数 一.命名关键字参数 # 命名关键字参数: 在定义函数时,*与**之间参数称之为命名关键字 ...

  5. 函数嵌套>作用域>闭包函数

    一:函数对象 函数是第一类对象,即表示函数可以当做数据传递 可以被引用:把函数内存地址赋值给一个变量名,仍然遵循函数的调用规则. 可以被当做参数传递:传递的是函数的运行的结果#可以当做返回值 把函数作 ...

  6. python12--字符串的比较 函数的默认值的细节 三元表达式 函数对象 名称空间 作用域 列表与字典的推导式 四则运算 函数的嵌套

     复习   1.字符串的比较; 2.函数的参数; ******实参与形参的分类: 3.函数的嵌套调用:     # 字符串的比较#  -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 ...

  7. day11函数的参数,函数对象 - 函数名,函数的嵌套调用

    复习 # 什么是函数:具体特定功能的代码块 - 特定功能代码块作为一个整体,并给该整体命名,就是函数 # 函数的优点: # 1.减少代码的冗余 # 2.结构清晰,可读性强 # 3.具有复用性,开发效率 ...

  8. 10 - 函数嵌套-作用域-闭包-LEGB-函数销毁

    目录 1 函数嵌套 2 作用域 2.1 global关键字 3 闭包 3.1 nonlocal关键字 4 默认值的作用域 5 变量名解析原则LEGB 6 函数的销毁 1 函数嵌套         一个 ...

  9. python基础之函数对象,嵌套,名称空间和作用域

    函数对象: 函数是第一类对象的含义是函数可以被当作数据处理 函数可用于: def func(): print(‘func’) 1.引用  f = func  把内存地址赋值给f 2.当作参数传给一个函 ...

  10. Day04:函数参数、对象、嵌套、闭包函数和装饰器

    上节课复习:    1.什么是函数        函数就是具备某一功能的工具    2.为何用函数        1.程序的组织结构和可读性        2.减少代码冗余        3.扩展性强 ...

随机推荐

  1. Kotlin 条件控制

    IF 表达式 一个 if 语句包含一个布尔表达式和一条或多条语句. // 传统用法 var max = a if (a < b) max = b // 使用 else var max: Int ...

  2. SpringMVC+Shiro整合配置文件详解

    http://blog.csdn.net/dawangxiong123/article/details/53020424

  3. C++将十进制数转化为二进制

    #include<iostream> using namespace std; void main() { ; ]; cin>>n; i=n; while(i) { a[j]= ...

  4. [lightoj P1306] Solutions to an Equation

    [lightoj P1306] Solutions to an Equation You have to find the number of solutions of the following e ...

  5. gdb pretty printer for STL debug in Linux

    Check your gcc version. If it is less than 4.7, you need use another printer.py file. Get the file f ...

  6. gcc 的参数 -Wall -O2 -ansi

    -Wall  生成所有警告信息 -o test (小写字母o)是说输出为test -ansi  是使用c++98标准去编译代码. 关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性 ...

  7. [Codeforces440D]Berland Federalization

    Problem 给你一棵树,最少删掉哪些边,能使得余下的至少有1个大小刚好为k的残树. 1 ≤ k ≤ n ≤ 400 Solution 用f[i][j]表示以i为根有j个节点的最少删边数量 因为此题 ...

  8. 网络编程,socket

    1.网络编程 网络: TCP/IP 彼此之间遵守协议和规范!之间才能产生通信! IP: 每个人都有自己的身份证号! 用来标识我们网络中每一台计算机! IP地址= 网络地址 +主机地址 网络地址 :标识 ...

  9. 【Java集合系列二】LinkedList解析

    一.简介 1.LinkedList继承关系 2.LinkedList底层实现 LinkedList使用双向链表存储数据,所以没有默认的容量,也不会有扩容一说.只有两个指针,永远指向链表的两端:firs ...

  10. spring+springMvc+struts的SSH框架整合

    1.建立一个web项目 2.导入SSH框架所需jar包 3.配置web.xml文件 <?xml version="1.0" encoding="UTF-8" ...