热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

三元表达式,各种生成式,匿名函数,常见重要内置函数

三元表达式三元表达式,也称为if,else的紧凑形式。具体用法如下defmax(a,b):ifab:returnaelse:returnbdefmax(a,b):returnai


三元表达式

三元表达式,也称为if,else的紧凑形式。具体用法如下
def max(a,b):
if a>b:
return a
else:
return b
def max(a,b):
return a if a>b else b
上面这两个函数实现的功能是完全一样的。第二个函数中 a if a>b else b 就是一个三元表达式。 左边是条
件为真时返回的值,中间是判断条件,右边是条件假返回的值。
"""
三元表达式
值1 if 条件 else 值2
条件如果成立则使用值1(if前面的数据)
条件如果不成立则使用值2(else后面的数据)
"""
# 补充:针对if分支结构 也有简化版本(了解即可)
'''子代码块都只有简单的一行情况下 也可以简写 没有三元表达式简单 但是也有人用'''
name = '春游去动物园'
if name == '春游去动物园': print(name)
else: print('秋游去动物园')

各种生成式

列表生成式

'''
大致的格式如下 [表达式 for 变量 in 列表 if 条件] ,其中if条件是可选的。
'''
a = [i**2 for i in range(10)]
print(a)
#[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
类似数学中的乘法分配律
a = [x*y for x in [1,2,3] for y in [4,5,6]]
print(a)
#[4, 5, 6, 8, 10, 12, 12, 15, 18]

列表生成式复杂用法:还具备筛选能力
a = [i for i in range(10) if i>=5]
print(a)
#[5, 6, 7, 8, 9]

'''列表生成式中值允许出现for和if 不能出现else 因为会产生歧义(for和if都能结合else)'''

字典生成式

#定义两个列表(索引值必须相等)
list1 = ['a','b','c','d']
list2 = ['1','2','3','4']
字典生成式
dic = {list1[i]:list2[i] for i in range(len(list1))}
print(dic)
执行结果:
{'a': '1', 'b': '2', 'c': '3', 'd': '4'}
#实现字典的key和value快速交换:
dic1={'a':1,'b':2}
dic2={v: k for k, v in dic1.items()}
print(dic2) #{1: 'a', 2: 'b'}

集合生成器

a = {i for i in range(10)}
print(a)
#{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
a = {i for i in range(10) if i != 2}
print(a)
#{0, 1, 3, 4, 5, 6, 7, 8, 9}

匿名函数

1.概念
匿名函数其实就是lambda表达式
语法 : lambda 形参列表:函数体

# 匿名函数
def text(x, y):
result = x + y

lambda x, y: x + y
"""
def text(x, y) 是def的声明部分,return x+y 是实现部分
lambda x,y是声明部分,x + y是实现部分
"""

匿名函数和正常函数的区别

def test():
print("test")


# 打印出函数,和函数的类型
print(test, type(test))
test() # 调用函数
'''
匿名函数不需要使用return进行值的返回,只需要将结果书写在函数体的部分,
值会被自动返回
'''
r1 = lambda: True
print(r1,type(r1))
print(r1())
执行结果

test
at 0x01CC2E38>
True
根据运行结果可以发现,
定义的函数,有test的函数名称,而使用匿名函数的 没有名称 函数的名称为 lambda函数
正常的函数调用时直接函数名(),而使用匿名函数是需要打印,或者赋值打印的

匿名函数的函数体可以直接写打印语句,但是返回值则为None

def test1():
print("test1")

print(test1())
r2 = lambda: print("lambda_print")
print(r2())
执行结果
test1
None
lambda_print
None

有参数的匿名函数

r1 = lambda x: x ** 3 # 传递一个x,然后给x三次方,并返回
print(r1(2)) # 打印2的三次方
r2 = lambda x, y: x + y # 传递一个x和y,然后给相加,并返回
print(r2(3, 5)) # 打印3+5
执行结果
8
8

匿名函数可以使用默认参数,关键字参数,不定长参数

r1 = lambda x, y=5: x + y # 默认参数
print(r1(2))
print(r1(2, 10))
print(r1(x=8, y=9)) # 关键字参数
r2 = lambda *a: a # 不定长参数 ,*a:代表可以输入多个或者0个值
print(r2(1, 2, 3, 4, 5, 6))
执行结果
7
12
17
(1, 2, 3, 4, 5, 6)

常见重要内置函数

1.map映射
map:使用指定方法去作用传入的每个可迭代对象的元素,生成新的可迭代对象
l1 = [11, 22, 33, 44, 55]
res = map(lambda x: x + 10, l1)
print(list(res)) # [21, 32, 43, 54, 65]
2.zip
zip:聚合传入的每个迭代器中相同位置的元素,返回一个新的元组类型迭代器
x = [1, 2, 3] # 长度3
y = [4, 5, 6, 7, 8] # 长度5
print(zip(x, y)) #
print(list(zip(x, y))) # 取最小长度3 [(1, 4), (2, 5), (3, 6)]
'''zip可以整合多个数据集,zip可以整合多个数据集 如果数据集之间个数不一致 那么依据短的'''

3.filter
filter:使用指定方法过滤可迭代对象的元素
a = [1, 2, 3, 4, 5, 6, 7, 8, 9]
def if_odd(x): #定义奇数判断函数
return x%2==1
print(list(filter(if_odd,a))) # [1, 3, 5, 7, 9]
print(list(filter(lambda x:x%2==1,a))) # [1, 3, 5, 7, 9]
4.reduce归总
reduce()函数也是Python内置的一个高阶函数。
python 3.0以后, reduce已经不在built-in function里了, 要用它就得导包(from functools import reduce)
reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传
入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。
def f(x, y):
return x + y
reduce(f, [1, 3, 5, 7, 9])
调用 reduce(f, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:
先计算头两个元素:f(1, 3),结果为4;
再把结果和第3个元素计算:f(4, 5),结果为9;
再把结果和第4个元素计算:f(9, 7),结果为16;
再把结果和第5个元素计算:f(16, 9),结果为25;
由于没有更多的元素了,计算结束,返回结果25。
reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,计算:
reduce(f, [1, 3, 5, 7, 9], 100)
结果为125。

我们也可以使用匿名函数:
from functools import reduce
L=reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
print(L) # 15

常见内置函数

1.abs() 获取绝对值
print(abs(-666)) # 666
print(abs(666)) # 666
2.all和any
all:判断可迭代对象的每个元素是否都为True值
any:判断可迭代对象的元素是否有为True值的元素
print(all([1, 2])) # 列表中每个元素逻辑值均为True,返回True
print(all([0, 1, 2])) # 列表中0的逻辑值为False,返回False
print(any([0, 1, 2])) # 列表元素有一个为True,则返回True
print(any([0, 0])) # 列表元素全部为False,则返回False

3.bin() oct() hex()
bin:将整数转换成2进制字符串
oct:将整数转化成8进制数字符串
hex:将整数转换成16进制字符串

4.bytes()
bytes:根据传入的参数创建一个新的不可变字节数组
bytes('中文','utf-8')
b'\xe4\xb8\xad\xe6\x96\x87'
和str配合使用可以实现编码和解码的功能
a = bytes('中文','utf-8')
print(a) # b'\xe4\xb8\xad\xe6\x96\x87'
res1 = str(a, 'utf8')
print(res1) # 中文
5.callable()
callable:检测对象是否可被调用
a = 1
def f1():
pass
print(callable(a)) #False
print(callable(f1)) #True
6.chr()、ord()
chr:返回整数所对应的Unicode字符
ord:返回Unicode字符对应的整数
b = 6666
print(chr(b)) # ᨊ
a = '吕'
print(ord(a)) # 21525

7.dir()
dir:返回对象或者当前作用域内的属性列表
返回数据类型可以调用的内置方法(查看对象内部可调用的属性)
print(dir(666))
['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__',
'__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__',
'__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__',
'__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__',
'__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__',
'__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__',
'__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__',
'__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__',
'__xor__', 'as_integer_ratio', 'bit_count', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag',
'is_integer', 'numerator', 'real', 'to_bytes']

8.divmod()
divmod() 函数把除数和余数运算结果结合起来,返回一个包含商和余数的元组
print(divmod(7, 2)) # (3, 1)
使用案例:
"""
可以使用在网站的分页制作上

总共250条数据 每页展示25条 需要多少页 10页
总共251条数据 每页展示25条 需要多少页 11页
总共249条数据 每页展示25条 需要多少页 10页
"""
def get_page_num(total_num,page_num): # 后面django分页器使用
more,others = divmod(total_num, page_num)
if others:
more += 1
print('需要%s页'%more)
get_page_num(1000,30) # 需要34页
9.enumerate()
enumerate:根据可迭代对象创建枚举对象
seasOns= ['Spring', 'Summer', 'Fall', 'Winter']
print(list(enumerate(seasons)))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
print(list(enumerate(seasons, start=1)))
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
for i in enumerate(seasons,start=1):
print(i)
执行结果
(1, 'Spring')
(2, 'Summer')
(3, 'Fall')
(4, 'Winter')
for i,j in enumerate(seasons,start=1):
print(i,j)
执行结果
1 Spring
2 Summer
3 Fall
4 Winter
10.eval() exec()
识别字符串中的python代码
res = """
for i in range(10):
print(i)
"""
eval(res) # 报错 (SyntaxError: invalid syntax)
exec(res) # 可以正常执行
区别:
eval函数:计算指定表达式的值。也就是说它要执行的Python代码只能是单个运算表达式(注意
eval不支持任意形式的赋值操作),而不能是复杂的代码逻辑,这一点和lambda表达式比较相似。
exec函数:动态执行Python代码。也就是说exec可以执行复杂的Python代码,而不像eval函数那
么样只能计算一个表达式的值。
eval()函数只能计算单个表达式的值,而exec()函数可以动态运行代码段。
eval()函数可以有返回值,而exec()函数返回值永远为None。

课堂练习

'''
编写一个二分法(快排)和装饰器
统计二分法(快排)执行的时间 数据自己模拟
'''
import time
def f1(func):
def f2(*args,**kwargs):
a = time.time()
time.sleep(1)
func(*args,**kwargs)
b = time.time()
print('用时:',b-a)
return f2
arr = [2, 3, 4, 10, 40]
max = len(arr)
@f1
def select_num(arr_list, r, max, min=0):
if max >= min:
mid = (max + min) // 2
if arr_list[mid] == r:
print('找到了')
return
if r return select_num(arr_list, r, mid - 1, min)
else:
return select_num(arr_list, r, max, mid + 1)
else:
print('找不到')
return
select_num(arr, 4, max) # 找到了
select_num(arr, 1, max) # 找不到



推荐阅读
  • python3 logging
    python3logginghttps:docs.python.org3.5librarylogging.html,先3.5是因为我当前的python版本是3.5之所 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 本文介绍了在Python中使用FOR循环实现用户输入错误值3次后终止程序的方法。作者提到了自己对这个问题的困惑和尝试,并给出了解决方案。该方案要求代码必须包含FOR循环,但作者不确定是需要一个FOR循环还是3个FOR循环。最后,作者还给出了一些示例代码来说明如何将英里转换为公里和将英寸转换为厘米。 ... [详细]
  • Java学习笔记之使用反射+泛型构建通用DAO
    本文介绍了使用反射和泛型构建通用DAO的方法,通过减少代码冗余度来提高开发效率。通过示例说明了如何使用反射和泛型来实现对不同表的相同操作,从而避免重复编写相似的代码。该方法可以在Java学习中起到较大的帮助作用。 ... [详细]
  • Python脚本编写创建输出数据库并添加模型和场数据的方法
    本文介绍了使用Python脚本编写创建输出数据库并添加模型数据和场数据的方法。首先导入相应模块,然后创建输出数据库并添加材料属性、截面、部件实例、分析步和帧、节点和单元等对象。接着向输出数据库中添加场数据和历程数据,本例中只添加了节点位移。最后保存数据库文件并关闭文件。文章还提供了部分代码和Abaqus操作步骤。另外,作者还建立了关于Abaqus的学习交流群,欢迎加入并提问。 ... [详细]
  • Django + Ansible 主机管理(有源码)
    本文给大家介绍如何利用DjangoAnsible进行Web项目管理。Django介绍一个可以使Web开发工作愉快并且高效的Web开发框架,能够以最小的代价构建和维护高 ... [详细]
  • 都说Python处理速度慢,为何月活7亿的 Instagram依然在使用Python?
    点击“Python编程与实战”,选择“置顶公众号”第一时间获取Python技术干货!来自|简书作者|我爱学python链接|https:www.jian ... [详细]
author-avatar
谭小牙笑不漏齿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有