#### 三元表达式: 就是if....else...的语法糖
#       -- 1) 只能解决if...else...结构,其他if分支结构都不管
#       -- 2)一个分支提供一个结果: 如果一个分支提供了多个结果, 将多个结果通过元组返回
# eg
# num = int(input('num:'))
# if num > 0:
#     print('正数')
# else:
#     print('非整数')
# 这是之前的用法
# 三元表达式简化写法
# num = int(input('num:'))
# print('正数' if num > 0 else '非整数')  # num =- 9 时 打印 非整数
# print('正数') if num > 0 else (print('非正数'), print('非正数'))  # num =- 9 时 打印 非整数  非整数

# a = int(input('a:'))
# b = int(input('b:'))
# res = a if a > b else (a, b) # a= 4  b= 6 结果(4,6)
# print(res)

# if a > b:
#     res = a
# else:
#     res = b

######列表与字典推导式:就是快速生成列表和字典  ,中间运用到for循环 格式都是 所需要的元素 元素在某某中循环得到所需要的元素

###### 列表推导式 :能被列表推导式推导的数据源必须在循环取值时可以得到一个值
# ls = [1, 2, 3, 4, 5]
# print(ls)
ls = []
for i in range(1, 6):
    ls.append(i)
print(ls)  # [1, 2, 3, 4, 5]

# 推导式
ls = [i for i in range(1, 6)]
print(ls)  # [1, 2, 3, 4, 5]
# ①多场景应用
print([v for v in range(1, 31)])
# ②推导式可以有简单的逻辑
# 求30以内的奇数,偶数
res = ['奇数' if i % 2 != 0 else '偶数' for i in range(1, 31)]  # '奇数' if i % 2 != 0 else '偶数'  对i  进行展开
print(res)
# 需求:解决10以内是3的倍数与不是3的倍数的排列方式  就是1- 9 中的三的倍数
res = ['3的倍数' if i % 3 == 0 else '不是3的倍数' for i in range(1, 10)]
print(res)

######  字典推导式 :能被字典推导式推导的数据源必须在循环取值时可以被解压赋值为两个值
dic = {'a': 1, 'b': 2}
res = {k: v for k, v in dic.items()}
print(res)  # {'a': 1, 'b': 2}

for k,v in dic.items():  # dic.items()  就是运用字典的for循环 就是把字典的k v 弄出来
    print(k, v)

ls = {'A': 1, 'B': 2}
res = {k: v for k, v in ls.items()}
print(res)  # {'A': 1, 'B': 2}

ls = {'A': 1, 'B': 2}
res = {k.lower(): v for k, v in ls.items()}  # k.lower() 是字符串字母转化为小写
print(res)  # {'a': 1, 'b': 2}  #  可以对k,v进行一些操作

ls = [['A', 1], ('B', 2)]    # 只要是分离的 就可以转化为k v模式
res = {k: v for k, v in ls}
print(res)  # {'A': 1, 'B': 2}

ls = [['A', 1], ('B', 2)]
res = {v: k.lower() for k, v in ls}   # 此时之后字母才能变成小写 则k对应的就是A和B
print(res)  # {1: 'a', 2: 'b'}

###### 函数对象;函数名
# 函数对象的应用场景
# 1.函数对象()就是调用函数
# 2.函数对象可以直接作为变量赋值给其他变量
# 3.函数对象可以作为函数的参数
# 4.函数对象可以作为函数的返回值
# 5.函数对象可以作为容器类型的成员
a = 10  # a存放的就是10的地址 a就是整形对象
b = [1, 2, 3]  # b存放的就是列表[1,2,3,]的地址,b就是列表对象
with open('1.txt', 'wb') as fn:
    print(fn, id(fn))
def fs():
    pass
print(fs,id(fs))  # 打印函数对象地址和内存地址 <function fs at 0x000001C94054C1E0> 1963879350752

### 函数对象的应用场景
# ①1.函数对象()就是调用函数
def fn1():
    pass
fn1() # 函数对象()  模式就是调用函数
# ②:函数对象可以直接作为变量赋值给其他变量
def fn2():
    pass
my_fn = fn2
print('>>>>', my_fn(), fn2)
my_fn()
# ③ 函数对象可以作为函数的参数

def fn3(func):  # func = my_fn = fn2
    func
fn3(my_fn)  # 这是把实参my_fn赋值给形参func ,my_fn 就是一个函数对象

# ④函数对象可以作为函数的返回值
def fn4():
    return my_fn
my_fn2 = fn4()
# ⑤ 函数对象可以作为容器类型的成员
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): # 第三个函数
    return func(n1, n2,)  # r1 时相当于add(n1,n2)  即 30
r1 = computed(10, 20, add)  # 10 赋值给n1 20 赋值给n2  add赋值给func 这时调用第三个函数,因为add是函数名,
print(r1) # 结果是30  # 调用()add时相当于调用第一个函数 则是10 + 20 = 30
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_map = {
    'add': add,
    'low': low
}
if cmd in fn_map:  # 作为容器的成员可以简化判断逻辑
    fs = fn_map[cmd]    # 判定fs是否在字典映射里
    res = computed(10, 20, fs)
    print(res)
else:
    print('该运算暂不支持')

#####
# part4
# 当输入对应 两个数进行运算  当输入q时就退出
# 功能层
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)

# 名称空间
# 名称空间:就是名字与地址的对应关系,可以被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

python之三元表达式,列表|字典推导式,函数对象的更多相关文章

  1. 周末学习笔记——day02(带参装饰器,wraps修改文档注释,三元表达式,列表字典推导式,迭代器,生成器,枚举对象,递归)

    一,复习 ''' 1.函数的参数:实参与形参 形参:定义函数()中出现的参数 实参:调用函数()中出现的参数 形参拿到实参的值,如果整体赋值(自己改变存放值的地址),实参不会改变,(可变类型)如果修改 ...

  2. day 14 三元运算符,列表字典推导式,递归,匿名函数,内置函数(排序,映射,过滤,合并)

    一.三元运算符 就是if.....else..... 语法糖 前提:if和else只有一条语句 #原始版 cmd=input('cmd') if cmd.isdigit(): print('1') e ...

  3. python基础-三元表达式/列表推导式/生成器表达式

    1.三元表达式:如果成立返回if前的内容,如果不成立返回else的内容 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' ...

  4. python递归-三元表达式-列表生成式-字典生成式-匿名函数-部分内置函数-04

    递归 递归: # 函数在调用阶段直接或间接地又调用了自身 应用场景: # 将列表中的数字依次打印出来(循环的层数是你必须要考虑的点)   -->  l = [1, [2, [3, [4, [5, ...

  5. Python基础之函数:4、二分法、三元表达式、生成/推导式、匿名函数、内置函数

    目录 一.算法简介之二分法 1.什么是算法 2.算法的应用场景 3.二分法 二.三元表达式 1.简介及用法 三.各种生成式 1.列表生成式 2.字典生成式 3.集合生成式 四.匿名函数 五.常见内置函 ...

  6. day12函数,三元表达式 ,列表推导式 ,字典推导式,函数对象,名称空间与作用域,函数的嵌套定义

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

  7. day14(2)---列表推导式、生成器推导式、字典推导式、三元表达式

    一.列表推导式: ls = [元素表达式 for i in 可迭代对象 if 筛选条件] 案例: # -*- coding: utf-8 -*- '''列表生成式练习''' # 练习一(三元表达式): ...

  8. python之三元表达式、列表推导、生成器表达式、递归、匿名函数、内置函数

    目录 一 三元表达式 二 列表推到 三 生成器表达式 四 递归 五 匿名函数 六 内置函数 一.三元表达式 def max(x,y): return x if x>y else y print( ...

  9. python的各种推导式(列表推导式、字典推导式、集合推导式)

    推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 共有三种推导,在Python2和3中都有支持: 列表(lis ...

随机推荐

  1. OA项目-需求分析

    ###############  需求分析   ############### """ 工作流 1,工单管理 2,执行记录 权限管理 1,菜单 2,角色, 用户管理 1, ...

  2. Exchange Onine功能介绍

    Exchange Online是Office 365中提供的一个邮箱服务.Microsoft Exchange Online是将Microsoft Exchange Server功能作为基于云的服务提 ...

  3. iOS渐变视图&动画库、腰杆、音频水滴水波手势、多种对话框、四级展开效果等源码

    iOS精选源码 用户行为追踪--无侵入埋点 .终端日志的打印 支持storyboard的渐变视图&动画库 支持圆形.竖直.横向的摇杆 纯swift实现的类似excel表格效果 swift实现自 ...

  4. 导出Wireless组中的成员

    get-adgroupmember -Identity wireless  |export-csv -path C:\Group.csv -Encoding UTF8

  5. 树剖想法题——BZOJ3626

    本来是打算作为树剖练习的最后一题的,结果一直WA. 本来以为是自己写的太丑. 最后发现5w的数据 我开了10w的数组 然而有一个数组要×2 哦,好棒棒. #include<cstring> ...

  6. top和margin-top的区别

    1.top等为绝对定位,需与position:absolute一起用才有效:而margin-top为相对定位: 2.绝对定位一般情况下以body为标准:若父元素设置position:relative, ...

  7. java中Redis5大基本类型的用法

    存储格式 基本用法 通过Jedis(封装了redis的Java客户端)对redis进行操作. Jedis工具类 public class JedisPoolUtil { private static ...

  8. JVM核心组成部分与作用介绍

    jvm由多个部分组成运作的 1.class loader类加载器: 加载类到内存里面,Class loader只需负责加载. 符合条件结构就加载到里面跑, 是否能运行顺利或者有没有错误异常,则需要Ex ...

  9. 再举个webstrom 正则应用例子。

    要将 "_behavior_chineseobj":{ "场所内网IP地址":"IP_ADDRESS", "源外网IPv4地址&q ...

  10. byte的取值范围是-128~127,那么包含-128和127吗?

    本帖最后由 王德升老师 于 2019-12-27 17:56 编辑 byte的取值范围为什么是-128~127?如果面试官问你取值范围包含127吗?1. 首先我们知道Java中byte类型是1个字节占 ...