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

谈谈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 2in <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…