当前位置: 首页 > 编程日记 > 正文

谈谈Python那些不为人知的冷知识(二)

640?wx_fmt=jpeg


本文转载自Python的编程时光(ID:Python-Time)


小明在日常Code中遇到一些好玩,冷门的事情,通常都会记录下来。


从上一篇的分享来看,仍然有不少 Pythoner 对这些冷知识存在盲区,所以今天迎来第二篇。


如果上篇你还没来得及查看,可以点击下方传送门直接进入。


谈谈 Python 那些不为人知的冷知识(一)


默认参数最好不为可变对象


函数的参数分三种

  • 可变参数

  • 默认参数

  • 关键字参数

这三者的具体区别,和使用方法在 廖雪峰的教程 里会详细的解释。这里就不搬运了。

今天要说的是,传递默认参数时,新手很容易踩雷的一个坑。

先来看一个示例

def func(item, item_list=[]):
    item_list.append(item)
    print(item_list)

func('iphone')
func('xiaomi', item_list=['oppo','vivo'])
func('huawei')

在这里,你可以暂停一下,思考一下会输出什么?

思考过后,你的答案是否和下面的一致呢

['iphone']
['oppo', 'vivo', 'xiaomi']
['iphone', 'huawei']

如果是,那你可以跳过这部分内容,如果不是,请接着往下看,这里来分析一下。

Python 中的 def 语句在每次执行的时候都初始化一个函数对象,这个函数对象就是我们要调用的函数,可以把它当成一个一般的对象,只不过这个对象拥有一个可执行的方法和部分属性。

对于参数中提供了初始值的参数,由于 Python 中的函数参数传递的是对象,也可以认为是传地址,在第一次初始化 def 的时候,会先生成这个可变对象的内存地址,然后将这个默认参数 item_list 会与这个内存地址绑定。

在后面的函数调用中,如果调用方指定了新的默认值,就会将原来的默认值覆盖。如果调用方没有指定新的默认值,那就会使用原来的默认值。

640?

个人理解的记忆方法,不代表官方,点击查看大图


访问类中的私有方法


大家都知道,类中可供直接调用的方法,只有公有方法(protected类型的方法也可以,但是不建议)。也就是说,类的私有方法是无法直接调用的。

这里先看一下例子:

class Kls():
    def public(self):
        print('Hello public world!')

    def __private(self):
        print('Hello private world!')

    def call_private(self):
        self.__private()

ins = Kls()

# 调用公有方法,没问题
ins.public()

# 直接调用私有方法,不行
ins.__private()

# 但你可以通过内部公有方法,进行代理
ins.call_private()

既然都是方法,那我们真的没有方法可以直接调用吗?

当然有啦,只是建议你千万不要这样弄,这里只是普及,让你了解一下。

# 调用私有方法,以下两种等价
ins._Kls__private()
ins.call_private()


时有时无的切片异常

这是个简单例子:

my_list = [1, 2, 3, 4, 5]
print(my_list[5])

执行一下,和我们预期的一样,会抛出索引异常。

Traceback (most recent call last):
  File "F:/Python Script/test.py", line 2, in <module>
    print(my_list[5])
IndexError: list index out of range

但是今天要说的肯定不是这个,而是一个你可能会不知道的冷知识。

来看看,如下这种写法就不会报索引异常,执行my_list[5:],会返回一个新list:[]。

my_list = [1, 2, 3]
print(my_list[5:])


哪些情况下不需要续行符


在写代码时,为了代码的可读性,代码的排版是尤为重要的。

为了实现高可读性的代码,我们常常使用到的就是续行符 \。

>>> a = 'talk is cheap,'\
...     'show me the code.'
>>>
>>> print(a)
talk is cheap,show me the code.

那有哪些情况下,是不需要写续行符的呢?

经过总结,在这些符号中间的代码换行可以省略掉续行符:[],(),{}

>>> my_list=[1,2,3,
...          4,5,6]

>>> my_tuple=(1,2,3,
...           4,5,6)

>>> my_dict={"name": "MING",
...          "gender": "male"}

另外还有,在多行文本注释中 ''' ,续行符也是可以不写的。

>>> text = '''talk is cheap,
...           show me the code'''

上面只举了一些简单的例子。

但你要学会举一反三。一样的,在以下这些场景也同样适用

  • 类,和函数的定义。

  • 列表推导式,字典推导式,集合推导式,生成器表达式。


Py2 也可以使用 print()

我相信应该有不少人,思维定式,觉得只有 Py3 才可以使用 print(),而 Py2 只能使用print ''。

今天,小明要为 Py2 正名一次。

在Python 2.6之前,只支持

print "hello"

在Python 2.6和2.7中,可以支持如下三种

print "hello"
print("hello")
print ("hello")

在Python3.x中,可以支持如下两种

print("hello")
print ("hello")


(本文为 AI科技大本营转载文章,转载请微信联系原作者)


◆

精彩推荐

◆


640?wx_fmt=jpeg


推荐阅读

  • 《权力的游戏》最终季上线!谁是你最喜爱的演员?这里有一份Python教程 | 附源码

  • 63万张!技术头条

  • 史上第一张黑洞照片是用Python合成的?

  • Python的10个“秘籍”,这些技术专家全都告诉你了

  • 但见高通笑,哪闻英特尔哭?

  • 下过富士康工厂、做过华为外包,这位程序员是如何花 6 年逆袭成为技术大佬的?

  • 微服务落地,我们在考虑什么?| 技术头条

  • 爆料! 18张图、55个链接, 证据都在这了, 你还说自己是中本聪?

  • 程序员为什么都爱穿冲锋衣?(最全总结)

640?wx_fmt=png


❤点击“阅读原文”,查看更多精彩文章。

相关文章:

前端每日实战:45# 视频演示如何用纯 CSS 创作一个菱形 loader 动画

效果预览 按下右侧的“点击预览”按钮可以在当前页面预览&#xff0c;点击链接可以全屏预览。 https://codepen.io/comehope/pen/eKzjqK 可交互视频教程 此视频是可以交互的&#xff0c;你可以随时暂停视频&#xff0c;编辑视频中的代码。 请用 chrome, safari, edge 打开观看。…

【数据库】SQLite和MySQL之间的对比和选择

目录1、各自特定2、使用场景3、选择哪个1、各自特定 SQLite &#xff1a;独立、简单&#xff08;零配置&#xff09;&#xff1b;适用于为单个应用程序和设备提供本地数据存储。 MySQL&#xff1a;可伸缩、高并发性&#xff1b;适用于客户端/服务器模式企业数据的共享数据存储…

MySql中管理百万级要注意些什么东西(转载)

一、我们可以且应该优化什么&#xff1f; 硬件 操作系统/软件库 SQL服务器(设置和查询) 应 用编程接口(API) 应用程序 二、优化硬件 如果你需要庞大的数据库表 (>2G)&#xff0c;你应该考虑使用64位的硬件结构&#xff0c;像Alpha、Sparc或即将推出的IA64。因为MySQL内部使用…

【数据库】sqlite3数据库备份、导出方法汇总

【数据库】sqlite3常用命令及SQL语句 目录1、直接拷贝数据库2、使用.backup .clone1&#xff09;交互式2&#xff09;脚本3、导出到csv文件中&#xff08;其它格式类似&#xff09;1&#xff09;交互式2&#xff09;脚本3&#xff09;导出成其它格式汇总a> .mode asciib>…

高通与苹果宣布“复合”,英特尔黯然退场 | 极客头条

作者 | 郭芮转载自公众号CSDN&#xff08;ID:CSDNnews&#xff09;为期两年的苹果高通“诉讼之争”经历了各种推波助澜愈演愈烈&#xff0c;俨然到了最为关键的白热化阶段&#xff0c;没成想&#xff0c;在刚刚正式进入美国司法庭审环节的两天后却被强势叫停了&#xff01;4 月…

MQTT 协议 Client ID 长度不能超过23个字符

今天遇到一个MQTT的问题&#xff0c;MqttException: MQIsdp ClientId > 23 bytes ClientId的长度大于23时&#xff0c;无法链接MQTT服务器。 经过查看协议发现&#xff1a;客户端标识符(Client ID)是介于1和23个字符长度,客户端到服务器的唯一标识。它必须在搜有客户端连接到…

【数据库】适用于SQLite的SQL语句(一)

目录一、统计函数二、表TABLE1、创建表CREATE TABLE2、更改表ALTER TABLE3、删除表DROP TABLE三、分析表ANALYZE四、附加数据库 ATTACH DATABASE五、事务六、核心函数七、索引INDEX1、创建索引&#xff1a;CREATE INDEX2、查看索引&#xff1a;3、使用索引 INDEXED BY4、删除索…

谷歌大神Jeff Dean点赞网红博士论文:改进分布式共识机制 | 技术头条

作者 | Heidi Howard编译 | 刘静本文转载自公众号图灵TOPIA&#xff08;ID:turingtopia&#xff09;本文作者Heidi Howard&#xff0c;是剑桥大学计算机科学与技术系系统研究小组的分布式系统研究员。Heidi的研究领域一直围绕分布式系统中的一致性&#xff0c;容错性和性能并且…

使用Nginx做前端服务器时让Apache得到真实IP的方法

一&#xff1a;nginx.conf proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 其实这个proxy.conf里面默认都有&#xff0c;在nginx.conf使用include proxy.conf就可以 二&#xff1a;apa…

Hadoop生态圈-hive五种数据格式比较

Hadoop生态圈-hive五种数据格式比较 作者&#xff1a;尹正杰 版权声明&#xff1a;原创作品&#xff0c;谢绝转载&#xff01;否则将追究法律责任。

华为巨资收购为云计算趟平道路?

华为巨资收购为云计算趟平道路&#xff1f;<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />文 小刀马众所周知&#xff0c;华为在全球的技术能力和市场地位也是有目共睹的&#xff0c;这是华为多少年兢兢业业守成的一种回报。更…

【数据库】适用于SQLite的SQL语句(二)

目录九、视图VIEW1、创建视图2、删除视图十、虚拟表1、创建虚拟表2、删除虚拟表十一、时间和日期的函数十二、分析和故障排除十三、SQL语句中的表达式1、运算符2、字面值3、参数十四、插入 INSERT十五、SQLite关键字十六、解决冲突 ON CONFLICT九、视图VIEW 视图是基于真实数据…

从对ML一窍不通到斩获AT等special offer,拿下大厂算法岗就靠它了

整理 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;2019 年春招就要过去&#xff0c;秋招也就不远了。对于很多计算机专业的毕业生来说&#xff0c;大部分都还处于迷茫期&#xff0c;由于大学时的大部分时间都可能在划水&#xff0c;导致不知道现在如何准备就…

WWDC2018总结

本人的第一篇文章&#xff08;现在写文章是为了提升自己的语句表达能力&#xff09; 欢迎大家观看本文章&#xff0c;是略微总结一下WWDC2018发布的iOS12的新东西 iOS12略微总结&#xff08;持续更新。。。&#xff09; iOS12 变化 iOS 12新功能汇总&#xff08;后面希望可以上…

make报错:/usr/bin/ld: cannot find -lXXX

在编译php时报错如下&#xff1a; # make 。。。 /usr/bin/ld: cannot find -lltdl collect2: ld returned 1 exit status make: *** [libphp5.la] Error 1 问题原因&#xff1a; 该问题一般是由于ld在进行库的连接时找不到库文件所致&#xff1a; 解决方案&#xff1a; 出现该…

for死循环、怪异字符串、两次return……Python冷知识(三)

本文转载自Python编程时光&#xff08;ID:Python-Time&#xff09;冷知识系列&#xff0c;已经更新至第三篇。前两篇传送门小明给你准备好了&#xff0c;还没阅读的可以学习一下。谈谈 Python 那些不为人知的冷知识&#xff08;一&#xff09;谈谈 Python 那些不为人知的冷知识…

snmpd 子代理模式编译测试

1、参考链接 1&#xff09;Net-snmp添加子代理示例https://blog.csdn.net/eyf0917/article/details/395466512、操作步骤1&#xff09;网络拷贝下面的文件http://www.net-snmp.org/tutorial/tutorial-5/toolkit/mib_module/NET-SNMP-TUTORIAL-MIB.txthttp://www.net-snmp.org/t…

【数据库】适用于SQLite的SQL语句(三)

目录十七、重新引索REINDEX十八、查询SELECT1、简单查询2、复合查询十九、更新UPDATE二十、公用表表达式&#xff08;CTE&#xff09;WITH1、普通表达式2、递归表达式二十三、VACUUM二十四、UPSERT十七、重新引索REINDEX REINDEX命令用于从头开始删除和重新创建索引。 十八、…

算法系列15天速成——第二天 七大经典排序【中】

首先感谢朋友们对第一篇文章的鼎力支持&#xff0c;感动中....... 今天说的是选择排序&#xff0c;包括“直接选择排序”和“堆排序”。 话说上次“冒泡排序”被快排虐了&#xff0c;而且“快排”赢得了内库的重用&#xff0c;众兄弟自然眼红&#xff0c;非要找快排一比高下。…

如何构建优质的推荐系统服务?| 技术头条

作者丨gongyouliu来源 | 大数据与人工智能&#xff08;ID:ai-big-data&#xff09;任何一个优质的软件服务都必须考虑高性能、高可用(HighAvailability)、可伸缩、可拓展、安全性等5大核心要素&#xff0c;推荐系统也不例外。所以&#xff0c;我们会围绕这5个点来说明&#xff…

DispatcherServlet之HandlerAdapter的handle

2019独角兽企业重金招聘Python工程师标准>>> 注&#xff1a;SpringFramework的版本是4.3.x。 1.DispatcherServlet的doService方法时序图 图1 DispatcherServlet的doService方法时序图 2.AnnotationMethodHandlerAdapter的handle方法时序图 图2的原图在Gith…

【C++】C++11 STL算法(九):番外篇

1、如果获取指针或迭代器指向的类型 详见&#xff1a;C 11&#xff1a;如何获取一个指针或迭代器指向的类型&#xff1f; decltype(*std::declval<Pointer>())decltype&#xff1a;c11关键字&#xff0c;类型推导。详见&#xff1a;【C】C11新增关键字详解 std::declva…

IBM Tivoli Netview在企业网络管理中的实践(附视频)

今天我为大家介绍的一款高端网管软件名叫IBM Tivoli NetView&#xff0c;他主要关注是IBM整理解决方案的用户&#xff0c;分为Unix平台和Windwos平台两种&#xff0c;这里视频演示的是基于Windows 2003 server下的IBM Tivoli NetView 6.1在企业中的部署应用&#xff0c;可以为大…

【C++】C++11 STL算法(十):使用STL实现排序算法

一、快速排序 1、适用于c11版本 template <class ForwardIt> void quicksort(ForwardIt first, ForwardIt last) {if(first last) return;auto pivot *std::next(first, std::distance(first,last)/2);ForwardIt middle1 std::partition(first, last, [pivot](con…

“你行你上”:有本事跟OpenAI Five打一把DOTA?| 极客头条

整理 | 一一出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;你们不是嫌弃世界冠军 OG 团队实力太水吗&#xff1f;“你行你上”的机会来了。4 月 14 日凌晨&#xff0c;OpenAI Five 以 2:0 击败了 DOTA 世界冠军团队 OG 引发热议。比赛当天&#xff0c;OpenAI 也宣布…

Java学习笔记二十五:Java面向对象的三大特性之多态

Java面向对象的三大特性之多态 一&#xff1a;什么是多态&#xff1b; 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口&#xff0c;使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现。 现实中&#xff0c;比如我们按下 F1 键这个动作&am…

省钱之道--图解域域树域林根域的含义

省钱之道--图解域域树域林根域的含义 标签&#xff1a;域 域林 图解域域树域林根域的含义 域树 根域原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://angerfire.blog.51cto.com/198455/1…

AI算法在FPGA芯片上还有这种操作?| 技术头条

作者 | 杨付收出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;碾压与崛起AI算法的崛起并非一帆风顺的&#xff0c;现在的主流的NN类的卷积神经网络已经是第二波浪潮了&#xff0c;早在上个世纪80年代&#xff0c;源于仿生学&#xff0c;后又发展于概率学的早期AI算…

[Doctrine Migrations] 数据库迁移组件的深入解析三:自定义数据字段类型

自定义type 根据官方文档&#xff0c;新建TinyIntType类&#xff0c;集成Type&#xff0c;并重写getName&#xff0c;getSqlDeclaration&#xff0c;convertToPHPValue&#xff0c;getBindingType等方法。 TinyIntType.php完整代码&#xff1a; <?php namespace db\types; …

【网络编程】同步IO、异步IO、阻塞IO、非阻塞IO

IO分两阶段&#xff1a; 1.数据准备阶段&#xff1a;在该阶段&#xff0c;根据是否等待数据准备&#xff0c;将IO分成阻塞和非阻塞&#xff1b; 2.内核空间复制回用户进程缓冲区阶段&#xff1a;在该阶段&#xff0c;只要程序需要等待复制完成&#xff0c;才能往下运行&#xf…