effective python学习笔记_函数

news2024/11/20 18:21:52

函数返回值尽量不要超过三个

局限性:当返回参数过多时,有时会搞混哪个是哪个,可能返回的两个值反了

解决方法:如果参数过多,可以组装*变量返回,或者自定义轻量类型或namedtuple返回

有意外情况时尽量抛异常而不是返回None

例子:当if判断除法运算结果时,即使结果为0运算成功,if也会判断为False

解决方法:1用二元组表示函数返回结果,第一个元素是运算是否成功,第二个元素是运算结果;

在闭包里使用外围作用域变量

py函数作用域可分为4个,从小到大依次是函数作用域,函数外围作用域(最内层函数以外,最外层函数以内,最内层函数也叫闭包),全局作用域,内置作用域(len str内置函数所在作用域)

若想给闭包外的外围作用域里的变量赋值,需要使用nonlocal,这样赋值时变量就先从外围作用域找变量。如果不用nonlocal则赋值会被当成在最内层作用域(闭包)内的新变量定义,而不会将值赋给外围作用域的同名变量

尽量少用nonlocal,因为可能会有潜在副作用,且较难看出问题所在

和nonlocal互补的一个是global,作用是声明当前变量作用域为全局作用域

用数量可变的位置参数给函数清晰的参数列表

位置参数形如*args,写法类似于解包

缺点1:传参时,函数会将多于的参数组成一个元组传给函数的位置参数,而组元组需要遍历元素。当元素数量过多时还会占用内存和时间

缺点2:当需要更新函数参数时,函数内对参数调用逻辑存在耦合,需要大量同步修改,且入参时如果参数数量变化,会导致位置参数前面的默认参数类别因为位置变化而类型变化,引起潜在bug。为解决此种问题,可以考虑添加参数类型为关键字参数

优点:接受可变个数的参数

适用性:适用于参数数量不是很多,可以提高可读性

关键字参数表示可选行为

函数可同时使用位置参数和关键字参数,当定义参数和入参时,位置参数需要在关键字参数前面,否则报错

调用函数时,关键字参数的key不可以重复,否则报错

优点:1可读性号,易懂 2可以在函数定义时设置默认值 3关键字参数支持灵活添加新参数,有向后兼容作用

用None和docstring描述默认值会变的参数

背景:比如log写日志需要日志时间戳,如果没传入时间则设为当前时间,但如果将datetime.datetime.now()赋值为默认参数,这个表达式只会在定义时计算结果,是个固定值,不会每次调用都是当前时间

解决方法:对于需要变化的函数默认值,用None替代,然后docstring写清楚怎么处理,在函数逻辑里处理此种情况

设置参数只能通过位置参数传递或关键字参数传递

函数定义时,当只定义了位置参数和关键字参数,调用函数传参时,其实一个参数既可以以位置参数传入也可以以关键字参数传入,如果需要固定一些参数传入形式,比如只能以位置参数形式传入,不能以关键字参数传入,可在定义函数时使用*。这样做了以后,如果以错误传参形式传参就会报错

怎么做:函数定义时,可以通过*实现*左边的参数都只能通过位置参数传入而*右边的参数都只能通过关键字参数传入,例如def test(a, b, *, c='c', d='d')

这样实际上位置参数也可以接受关键字参数方式传入,因为*只保证*右边的参数强制以关键字参数传入否则报错,但无法保证*左边的以位置参数传入,py3.8及以后版本实现了对位置参数类似的支持,即/号。/左边的参数强制以位置参数传入,否则报错。当/ 和 *同时出现在函数参数定义中,/和*中间的参数可以位置参数和关键字参数形式传入

用functools.wraps定义函数修饰器

会导致什么问题:之前提过,用装饰器修饰函数后,函数的__name__会变成装饰器内层的函数名,还会在pickle.dumps时报错,报错无法找到原始函数的位置,不光如此,函数还有一些其他内置属性,被装饰时候会被装饰函数取代

解决方案:使用functools.wraps装饰装饰器里的内层函数,会保留函数大部分原始的属性不被替换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1654948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux学习笔记2---Makefile

单个文件编译用gcc编译确实是挺方便的,但是多个文件需要编译一个个的编译就属实是麻烦了,而针对多文件编译也有快捷的办法,即Makefile脚本。要运行Makefile需要先安装make程序。 apt install make 1.什么是Makefile 一个工程中的源文件不计…

如何提高日语听力?日语学习日语培训柯桥小语种学校

每次一说起练日语听力,总离不开一个词,那就是“磨耳朵”。 可是,“磨耳朵”真的有用吗? 在讨论这个问题之前,我们需要先知道:什么是“磨耳朵”? 所谓的“磨耳朵”,其实就是让我们的耳…

【Ubuntu20.04安装java-8-openjdk】

1 下载 官网下载链接: https://www.oracle.com/java/technologies/downloads/#java8 下载 最后一行 jdk-8u411-linux-x64.tar.gz,并解压: tar -zxvf jdk-8u411-linux-x64.tar.gz2 环境配置 1、打开~/.bashrc文件 sudo gedit ~/.bashrc2、…

2024蓝桥杯CTF writeUP--packet

根据流量分析,我们可以知道129是攻击机,128被留了php后门,129通过get请求来获得数据 129请求ls Respons在这 里面有flag文件 这里请求打开flag文件,并以base64编码流传输回来 获得flag的base64的数据 然后解码 到手

知识点(慢慢更新..break,continue,return)

目录 一. break,continue,return用法和含义 1. break 2. continue 3. return 4. 总结 一. break,continue,return用法和含义 1. break break用于完全结束一个循环,跳出循环体,执行循环后面的语句。 使用场合主要是switch语句和循环结构。 ● 在循…

一键复制:基于vue实现的tab切换效果

需求&#xff1a;顶部栏有切换功能&#xff0c;内容区域随顶部切换而变化 目录 实现效果实现代码使用示例在线预览 实现效果 如下 实现代码 组件代码 MoTab.vue <template><div class"mo-tab"><divv-for"item in options"class"m…

Axure PR 10 下拉三级菜单设计图

在线预览地址&#xff1a;Untitled Document 程序员必备资源网站&#xff1a;天梦星服务平台 (tmxkj.top) 需要源码设计图联系我wx:19948765606,3块钱拿走

信息收集(详细)

文章目录 网站要素IP信息资产架构信息服务信息网站信息cms信息源码信息中间件信息 个人信息收集其它 渗透的第一步就是信息收集&#xff0c;通常信息收集的结果如何&#xff0c;会直接影响后续能否渗透成功。好的信息收集可以让攻击面更广&#xff0c;思路更加广。 本文对信息收…

Centos 中如何汉化man命令

刚学Linux&#xff0c;记不住命令和选项&#xff0c;很依赖里面的 man 查看命令&#xff0c;但因为着实看不懂&#xff0c;有没有什么办法把man查看命令的信息改成中文 在CentOS 7中&#xff0c;你可以通过安装man-pages-zh包来获取中文的man手册。以下是具体的步骤&#xff1a…

CCF-Csp算法能力认证, 202303-1重复局面(C++)含解析

前言 推荐书目&#xff0c;在这里推荐那一本《算法笔记》&#xff08;胡明&#xff09;&#xff0c;需要PDF的话&#xff0c;链接如下 「链接&#xff1a;https://pan.xunlei.com/s/VNvz4BUFYqnx8kJ4BI4v1ywPA1?pwd6vdq# 提取码&#xff1a;6vdq”复制这段内容后打开手机迅雷…

钟表——蓝桥杯十三届2022国赛大学B组真题

问题分析 这个问题的关键有两点&#xff1a;1.怎么计算时针&#xff0c;分针&#xff0c;秒针之间的夹角&#xff0c;2.时针&#xff0c;分针&#xff0c;秒针都是匀速运动的&#xff0c;并非跳跃性的。问题1很好解决看下面的代码就能明白&#xff0c;我们先考虑问题2&#xf…

第9章 负载均衡集群日常维护

一个设计良好的高可用负载均衡集群&#xff0c;交付使用以后并不能一劳永逸。欲使其高效、稳定、持续对外服务&#xff0c;日常维护必不可少。 对于高可用负载均衡集群来说&#xff0c;有两种类型的维护形式&#xff1a;常规性维护与突发性维护。突发性维护一般指故障处理&…

最大数字——蓝桥杯十三届2022国赛大学B组真题

问题分析 这道题属于贪心加回溯。所有操作如果能使得高位的数字变大必定优先用在高位&#xff0c;因为对高位的影响永远大于对低位的影响。然后我们再来分析一下&#xff0c;如何使用这两种操作&#xff1f;对于加操作&#xff0c;如果能使这一位的数字加到9则变成9&#xff0…

Docker与Harbor:构建企业级私有Docker镜像仓库

目录 引言 一、本地私有仓库 &#xff08;一&#xff09;基本概述 &#xff08;二&#xff09;搭建本地私有仓库 1.下载registry镜像 2.启动容器 3.上传本地镜像 4.客户端下载镜像 二、Harbor简介 &#xff08;一&#xff09;什么是 Harbor &#xff08;二&#xff…

IT外包能在企业上云时提供什么帮助?

在云计算不断发展的背景下&#xff0c;企业对IT部门的要求日益提高&#xff0c;越来越多的企业开始考虑将IT系统迁移到云上。因此&#xff0c;IT外包也成为企业成功上云的重要支持之一。IT外包在企业上云时具体能提供什么帮助&#xff1f;本文将对此进行详细阐述。 业务重心转移…

必应bing国内广告如何开户,怎么收费?

搜索引擎广告作为直接触达潜在客户的有效途径之一&#xff0c;日益受到企业的重视&#xff0c;必应Bing作为全球第二大搜索引擎&#xff0c;在中国市场同样拥有庞大的用户群体&#xff0c;为企业提供了不可忽视的广告投放平台。 一、必应bing国内广告开户流程 1、需求分析与咨…

C语言 循环语句 (3) for 循环语句

接下来 我们来看第三个 for语句 基本语句是 for关键字 然后小括号 括号中三个表达式 然后它对表达式2进行判断 如果表达式2条件成立 则走进循环体 执行完循环体 会回来执行表达式3 然后再返回来 继续对表达式2进行判断 如果表达式2 还是成立 这继续循环往复 直到表达式2的条件…

游戏理解入门:Rust+Bracket开发一个小游戏

1. Game loop 使用game loop可以使得游戏运行更加流畅和顺滑&#xff0c;它可以&#xff1a; 初始化窗口、图形和其他资源&#xff1b;每当屏幕刷新他都会运行(通常是每秒30,60 )&#xff1b;每次通过循环&#xff0c;他都会调用游戏的tick()函数。 大致的原理流程如下&…

那个在买珠宝的年轻人

金价搭上过山车&#xff0c;今年以来价格一路飙涨。 珍珠身价同步飙升&#xff0c;晋级珠宝圈“新宠”。 文玩圈“减龄”&#xff0c;盘珠串不再只是“老头乐”。 月薪3000的年轻人&#xff0c;悄悄实现“宝石”自由。 黄金珠宝走俏&#xff0c;这届年轻人到底有着怎样的珠宝…

揭秘文件加密利器:24年度最值得信赖的5大加密软件评测

数据安全与隐私保护已成为我们每个人都必须面对的重要问题。 文件加密软件作为保障数据安全的关键工具&#xff0c;其重要性不言而喻。 在众多的加密软件中&#xff0c;哪些软件能够在保障数据安全的同时&#xff0c;又具备良好的易用性和稳定性呢&#xff1f; 本文将为您揭秘…