复习
 
1.字符串的比较;
2.函数的参数;
******实参与形参的分类;
3.函数的嵌套调用;
 
 
# 字符串的比较
#  -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较
# 函数的参数
# 1)实参与形参:
# -- 形参:在函数定义时()中出现的参数
# -- 实参:在函数调用时()中出现的参数
# 2)实参的分类
# -- 位置实参:给位置形参,必须按位置
# -- 关键字实参:给位置与关键字形参,不需要按顺序
# 3)形参的分类
# -- 无值位置
# -- 有值位置
#  -- 可变长位置
# -- 有无值关键字
# -- 可变长关键字
def fn(a, b=10, *args, x, y=20, z, **kwargs): pass
# 4)打散机制
(1)单列容器会打散单列容器;
(2)双列容器会打散双列容器;
(3)字符串也可以被打散
def func(*args, **kwargs):
    pass
func('a', 'b', 'c', a=1, b=2)
func(*'abc', **{'a': 1, 'b': 2})  # args=('a', 'b', 'c')  kwargs={'a': 1, 'b': 2}
# 函数的嵌套调用
#  -- 在被调用的函数中调用其他函数:在被调用的函数中要去使用其他函数的功能——功能有重叠
```
 
 
 
## 今日内容
 
# 1.函数默认值的细节:理解一下 *
# 2.数据类型的补充:语法简单,经常去使用就ok ***
# -- 三元表达式 
   --列表推导式
   --字典推导式
# 3.函数对象:函数名的各种应用场景 *****
 
#函数对象案例:四则运算,思路剖析
# 4.名称空间与作用域:解释变量名重复与冲突问题 *****
# 5.函数的嵌套定义:在函数内部定义函数 *****
```
 
'''
学习观念:顾名思义
       整数变量做运算;
      函数变量做调用
'''
 
## 一。函数默认值的细节
# 如果函数的默认参数的默认值为变量,在所属函数定义阶段一执行就被确定为当时变量存放的值
案例:
a = 100
def fn(num=a):       #函数的形参:默认形参(num=a,a为变量)
    print(num)  # 100
a = 200
fn()
```
二。数据类型的补充
## (一)三元表达式:就是if...else...的语法糖
# 1.三目运算符:用于简化 if...else...的语法结构
#       -- 1) 只能解决if...else...结构,其他if分支结构都不管
#       -- 2)一个分支提供一个结果: 如果一个分支提供了多个结果, 将多个结果通过元组返回
案例
a = int(input('a: '))
b = int(input('b: '))
res = a if a > b else b       #一句话语法,if前为符合条件码的结果,后面为相反结果
print(res)
```
 
##(二). 列表与字典推导式
 
      # 快速生成列表或字典的语法糖,且能在生成过程中添加简单的逻辑
 
#1. 能被列表推导式推导的数据源必须在循环取值时可以得到一个值[]
案例
ls = [v for v in range(1, 6)]
print(ls)  # [1, 2, 3, 4, 5]
ls = ['奇数' if v % 2 != 0 else '偶数' for v in range(1, 6)]
print(ls)  # ['奇数', '偶数', '奇数', '偶数', '奇数']
# 2.能被字典推导式推导的数据源必须在循环取值时可以被解压赋值为两个值{}
案例
ls = [['A', 1], ('B', 2)]
res = {k.lower(): v for k, v in ls}
print(res)  #{'a': 1, 'b': 2}
```
 
## 三.函数对象--函数名
 
(一)定义
# 在python中,所有变量存放的值只要是地址,我们就称之为对象
#       -- 所有的变量都是用来存放地址的,所以都是对象
#               -- 存放整型的地址就是整型对象 | 存放函数的地址就是函数对象 | 存放文件的地址就是文件对象
# 函数对象:存放函数地址的变量就是函数对象
def fn(): pass
my_fn = fn






# my_fn | fn都存着函数地址,所以都是函数对象,函数对象的使用就是 函数对象() 来调用函数










#(二). 函数对象的应用场景
# 1.函数对象()就是调用函数
# 2.函数对象可以直接作为变量赋值给其他变量
# 3.函数对象可以作为函数的参数
# 4.函数对象可以作为函数的返回值
# 5.函数对象可以作为容器类型的成员
 
案例
# 1.函数对象()就是调用函数
def fn1():
    pass
fn1()
# 2.函数对象可以直接作为变量赋值给其他变量
def fn2():
    pass
my_fn = fn2
print('>>>', my_fn, fn2)
my_fn()
# 3.函数对象可以作为函数的参数
def fn3(func):  # func = my_fn = fn2
    func()
fn3(my_fn)
# 4.函数对象可以作为函数的返回值
def fn4():
    return my_fn
my_fn2 = fn4()
# 5.函数对象可以作为容器类型的成员
ls = [my_fn, my_fn2]
```
 
##四.函数对象案例:四则运算,思路剖析

# part1
'''
# 加法运算
def add(n1, n2):
return n1 + n2
#减法运算
def low(n1, n2):
return n1 - n2 说明;
def computed(n1, n2, func): #computed计算
# if cmd == 'add': #cmd命令
# return add(n1, n2)
# elif cmd == 'low':
# return n1 - n2
return func(n1, n2) r1 = computed(10, 20, add)
print(r1)
r2 = computed(10, 20, low)
print(r2)
''' # part2
"""
def add(n1, n2):
return n1 + n2 def low(n1, n2):
return n1 - n2 def computed(n1, n2, func):
return func(n1, n2) cmd = input('cmd: ') # 只能等于字符串add、low => 什么方式可以将字符串add、low对应上函数
# fn = None
# if cmd == 'add':
# fn = add
# elif cmd == 'low':
# fn = low
# computed(10, 20, fn) fn_map = {
'add': add,
'low': low
} if cmd in fn_map: # 作为容器的成员可以简化判断逻辑
fn = fn_map[cmd]
res = computed(10, 20, fn)
print(res)
else:
print('该运算暂不支持')
""" # part3
""" def add(n1, n2):
return n1 + n2 def low(n1, n2):
return n1 - n2 def jump(n1, n2):
return n1 * n2 def computed(n1, n2, func):
return func(n1, n2)
fn_map = {
'add': add,
'low': low,
'jump': jump
} def get_fn(cmd):
f = add # 默认为add函数
if cmd in fn_map:
f = fn_map[cmd] # 如果指令正确就返回对应的函数,如果不正确,就是采用默认的函数
return f while True:
cmd = input('cmd: ')
if cmd == 'q':
break fn = get_fn(cmd)
res = computed(10, 20, fn)
print(res) # while True:
# cmd = input('cmd: ')
# if cmd == 'q':
# break
# if cmd in fn_map:
# fn = fn_map[cmd] # 通过指令找函数
# res = computed(10, 20, fn)
# print(res)
# else:
# print('该运算暂不支持')
""" # part4 # 功能层
def add(n1, n2):
return n1 + n2
def low(n1, n2):
return n1 - n2 def jump(n1, n2):
return n1 * n2 # 实现层
def computed(n1, n2, func):
return func(n1, n2) # 映射层
fn_map = {
'add': add,
'low': low,
'jump': jump
} # 完成映射对应
def get_fn(cmd):
f = add # 默认为add函数
if cmd in fn_map:
f = fn_map[cmd] # 如果指令正确就返回对应的函数,如果不正确,就是采用默认的函数
return f # 程序入口
while True:
cmd = input('cmd: ')
if cmd == 'q':
break fn = get_fn(cmd)
res = computed(10, 20, fn)
print(res) while True:
cmd = input('cmd: ')
if cmd == 'q':
break fn = get_fn(cmd)
res = computed(10, 20, fn)
print(res)
##五。名称空间
# 名称空间:就是名字与地址的对应关系,可以被Python解释器遍历查找,采用堆栈存储方式
 
 
# 三种名称空间
# Built-in:内置名称空间;系统级,一个;随解释器执行而产生,解释器停止而销毁
# Global:全局名称空间;文件级,多个;随所属文件加载而产生,文件运行完毕而销毁
# Local:局部名称空间;函数级,多个;随所属函数执行而产生,函数执行完毕而销毁
# 注:文件中的if、while、for、with这些能产生缩减的关键字并不能产生名称空间
# 加载顺序:Built-in > Global > Local
```
 
 
##六 函数嵌套定义
# 概念:在一个函数内部定义另一个函数
案例
def outer():
    print('outer run')
    a = 10
    # 函数对象(变量)与普通对象(变量)一样,在函数内部定义,随函数调用而产生,
    # 调用结束而销毁,所以只能在函数内部调用
    def inner():
        print('inner run')
    inner()
outer()
```
 
 
## 七。作用域
# 作用域:变量(名字|对象)起作用的范围
# 四种作用域
# Built-in:内置作用域:作用所有文件的所有地方
# Global:全局作用域:作用当前文件的所有地方
# Enclosing:嵌套作用域:作用当前函数已内部被嵌套函数
# Local:局部作用域:作用当前函数内部
 
# 注:
# 不同作用域之间名字不冲突,以达到名字的重用
# 每个作用域优先使用自己作用域中的名字,没有再找更大的名称空间的名字,直到内置,还没有就报错
# 查找顺序:Local > Enclosing > Global > Built-in
```
 
 
 
 
 

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

  1. python学习Day12 函数的默认值、三元表达式、函数对象(函数名)的应用场景、名称空间与作用域

    复习 1.字符串的比较: -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 2. 函数的参数 : 1)实参与形参:       -- 形参:在函数定义时()中出现的参数       ...

  2. day_12函数默认值,数据类型的补充,函数对象名称空间与作用域,函数的嵌套定义

    复习, 昨天讲了字符串的比较,按照从左往右比较每一个字符,通过字符对应的ASCII码进行比较 函数的参数,‘ 实参与形参 形参:在函数定义时()中出现的参数 实参,在函数调用时()中出现的参数 实参的 ...

  3. Python函数参数默认值的陷阱和原理深究"

    本文将介绍使用mutable对象作为Python函数参数默认值潜在的危害,以及其实现原理和设计目的 本博客已经迁移至: http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...

  4. java函数参数默认值

    java函数参数默认值 今天,需要设定java函数参数的默认值,发现按照其它语言中的方法行不通 java中似乎只能通过函数的重载来实现 函数参数默认代码

  5. ES6学习 --函数参数默认值与解构赋值默认值

    1. ES6的解构ES6中引入了解构赋值的操作,其作用是:将值从数组Array或属性从对象Object提取到不同的变量中 即分为两种情况:从数组Array中解构,以及从对象Object中解构 ①.从数 ...

  6. 为什么C++函数形参默认值从最末一个赋值?

    [1]函数调用时形参的压栈顺序 1.示例代码如下(VS2010): #include <iostream> using namespace std; ); void fun(int a, ...

  7. Python函数参数默认值的陷阱和原理深究(转)

    add by zhj: 在Python文档中清楚的说明了默认参数是怎么工作的,如下 "Default parameter values are evaluated when the func ...

  8. php函数指定默认值的方法

    发布:JB02   来源:脚本学堂     [大 中 小] 本文介绍下,在php编程中,指定函数的默认值的方法,分享二个例子,供大家学习参考下.本文转自:http://www.jbxue.com/ar ...

  9. ES6函数参数默认值作用域的模拟原理实现与个人的一些推测

    一.函数参数默认值中模糊的独立作用域 我在ES6入门学习函数拓展这一篇博客中有记录,当函数的参数使用默认值时,参数会在初始化过程中产生一个独立的作用域,初始化完成作用域会消失:如果不使用参数默认值,不 ...

随机推荐

  1. Android ble蓝牙使用注意

    以下均为自己在Android ble开发项目中遇到的问题 1.尽量不要在BluetoothGattCallback里面的回调函数中执行读写通知操作,最多一个,因为例如在onServicesDiscov ...

  2. 如何去掉(隐藏)系统的StatusBar(状态栏)

         在定制TV版本中,经常需要去掉StatusBar的需求,那么如何更好更方便的去掉StatusBar呢?         StatusBar是Android系统中重要的组成部分,可以看到一些提 ...

  3. 无限极分类(adjacency list)的三种方式(迭代、递归、引用)

    一般的分类树状结构有两种方式: 一种是adjacency list,也就是是id,parent id这中形式. 另一种是nested set,即左右值的形式. 左右值形式查询起来比较高效,无需递归等, ...

  4. Python 经典面试题汇总之基础篇

    基础篇 1:为什么学习Python 公司建议使用Python,然后自己通过百度和向有学过Python的同学了解了Python.Python这门语言,入门比较简单,它简单易学,生态圈比较强大,涉及的地方 ...

  5. win2008server R2 x64 部署.net core到IIS--ASP .NET Core HTTP Error 502.5 – Process Failure

    服务器win2008server R2 x64 部署.net core到IIS 解决ASP .NET Core HTTP Error 502.5 – Process Failure 问题等 1.发布网 ...

  6. Fix: Unable to terminate process ‘Access is denied’ 杀进程,关服务

    https://appuals.com/fix-unable-to-terminate-process-access-is-denied/ 我 Process Hacker (方法3),成功杀掉: 阿 ...

  7. js常用写法

    遍历数组 ES5 写法 arr.forEach(function(value,index){ console.log(index+'--'+value); }) 遍历数组  ES6 写法 for( l ...

  8. 基于jQuery实现简单的js模块化

    在多人合作完成网页,经常遇到大家的js代码相互影响的问题.现在有许多模块化的前端框架,应该是可以解决这个问题.但本人并非前端开发人员,那些框架都没用过,只对jQuery相对熟悉,就想用jQuery来解 ...

  9. npm包--rimraf

    含义 rimraf 包的作用:以包的形式包装rm -rf命令,用来删除文件和文件夹的,不管文件夹是否为空,都可删除. 安装 npm install rimraf --save-dev 使用 const ...

  10. JS Arry 常用方法总结

    var arr = ["a", "b", "c", "1", "2", "3"] ...