复习
 
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串口通讯

    今天在整一个项目,需要利用串口通讯在网上看了好多人的帖子才稍微整出了一点头绪. 首先串口代码就是利用谷歌自己的api,将java代码放在java/android_serialport_api目录下,如 ...

  2. 如何简单的构建Android?

    原文链接:https://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/   过去的几个月中,在Tuenti上与同行例 ...

  3. 什么是Docker,它可干什么?

    定义我们知道,软件依赖的环境大致包括: 1• 配置文件2• 代码3• tomcat4• JDK5• 操作系统 Docker作为一个软件集装箱化平台,可以让开发者构建应用程序时,将它与其依赖环境一起打包 ...

  4. Linux常用命令--文件操作

    常用Linux命令笔记(1) 1. 创建文件/文件夹 参考博客:https://www.cnblogs.com/lclq/p/5741852.html. 使用cat命令创建新文件: 输入命令 # ca ...

  5. Puppeteer学习之小试牛刀

    最近有了写文章的动力了,一方面是受到了很多前辈们的启示,另一方面也是为了记录下来更好地学以致用.闲言少叙,先说说Puppeteer是什么. Puppeteer是一个node库,提供了一些用来操作Chr ...

  6. ILRuntime官方Demo笔记

    调用/执行 热更中的方法 调用热更代码中方法,写在AppDomain中,记录一下主要几个方法: AppDomain.LoadAssembly 加载热更dll 执行热更代码的方法,有两种方式: appd ...

  7. 解决CSDN需要登录才能看全文

    本来今天学习遇到一些问题,在网上翻着博客,突然在csdn里就提示要登录才能看全文. 看了下页面源码博客内容已经拿到本地了,只是加了一层罩,也是挺无语的,暂时先用这种方法解决吧: (function() ...

  8. Django 使用mysql 创建项目

    一.安装 mysql 和 mysqlclient 1. 安装 mysql ,https://www.jianshu.com/p/07a9826898c0 2. pip3 install mysqlcl ...

  9. Elastic Stack-Kibana使用介绍(七)

    一.前言     主要来讲述一下Kibana使用以及上生产时候的一些配置,要是大家对这块比较感兴趣我到时候也可以在结合Grafana做一些图表方面的介绍,后面等介绍完Beats以后我去阿里云租几台机器 ...

  10. linux-----docker

    docker简介 Docker时Docker.Lnc公司开源的一个基于LXC技术之上搭建的Container容器引擎,源代码托管在Github上,基于Go语言并遵从Apache2.0协议开源. Doc ...