python基础教程九 抽象四(函数参数终)

文章预览:

  • 1. 分配参数
  • 2. 作用域
  • 3. 递归
    • 1. 俩个经典案例:阶层和幂
    • 2. 递归的意义
    • 1. 递归二分查找
        • 1. 二分查找的条件
        • 1. 二分查找的意义

1. 分配参数

前面介绍了如何将参数收集到元组和字典当中,但同样的俩个运算符,也可以执行相反的操作。与收集参数相反的操作是分配。假设有如下函数:

def add(x,y):return x+y

同时假设还有一个元组,其中包含俩个你要相加的数。
params=(1,2)
这与前面执行的操作差不多是相反的:不是收集参数,而是分配参数。这是通过在调用函数时使用运算符*实现的。
add(params)
3
这种做法也可以用于参数列表的一部分,条件是这部分位于参数列表的末尾。使用运算符
*,可将字典中的值分配给关键字参数,例如

>>> def output(name='LI'):
...     print(name)
...
>>> s={'name':'yuan'}
>>> output(**s)
yuan

如果在定义和调用函数时都使用*或**,将只传递元组和字典。因此还不如不使用它们。

2. 作用域

所谓的作用域就是变量生效的范围,那么有多少个命名空间呢?除全局作用域外,每次函数调用都将创建一个。

>>> def foo():x=42
...
>>> x=1
>>> foo()
>>> x
1
>>>

在这里,函数foo修改了(重新关联)了变量x,但当你最终查看的时候,它根本没变。这是因为调用foo时创建了一个新的命名空间,供foo的代码使用。赋值语句x=42是在这个内部作用域中执行的,不影响外部作用域内的x。在函数内使用的变量称为局部变量。

但如果在函数中访问全局变量呢?如果只是想读取这种变量的值(不重新关联它)。通常不会有任何问题。

>>> def c(string):
...     print(string+a)
...
>>> a='ssss'
>>> c('aaaaaa')
aaaaaassss

像这样访问全局变量是众多bug的根源,务必慎用全局变量。

读取全局变量的值通常不会有问题,但还是存在出现问题的可能性,如果有一个局部变量与全局变量重名,就无法直接访问全局变量,因为它被局部变量覆盖了。
如果需要,可使用函数globals来访问全局变量例如:
>>> def combine(para):
...     print(para+globals()['para'])
...
>>> para='2222'
>>> combine('1111')
11112222

重新关联全局变量是另一码事。在函数内部给变量赋值时,该变量是局部变量,除非你明确地告诉python它是全局变量。global关键字

>>> x=1
>>> def change_global():
...     global x
...     x=x+1
...
>>> change_global()
>>> x
2

3. 递归

递归是函数引用自身的一种方式,主要是依靠系统栈去帮助完成的。
递归分为递归条件和基线条件,基线条件是满足这种条件时函数将直接返回一个值。递归条件是包含一个或多个调用。这些调用旨在解决问题的一部分。

1. 俩个经典案例:阶层和幂

首先探讨一个问题,将n个人排成一队有多少种方式。
可以使用循环

>>> def fac(num):
...     f=1
...     for i in range(1,num+1):
...             f*=i
...     return f
...
>>> fac(5)
120

这种实现可行而且直接了当,递归的方式关键在于阶乘的数学定义,表示如下.
1的阶乘是1
对于大于1的数字n,其阶乘为n-1的阶层再乘以n。
理解了这个定义,实现起来就很容易。

>>> def fac(num):
...     if num==1:
...             return 1
...     else:
...             return num*fac(num-1)
...
>>> fac(5)
120

幂的方式大同小异,不再论述。

2. 递归的意义

递归可以不能转换成循环吗?大多是是可以的,而且转换完效率更高。然而,在很多情况下,使用递归的可读性更高,而有时要高很多,在你理解了函数的递归式定义尤其如此。但是递归有几项弱点要注意,举例递归本质是用系统栈作为临时的保存,那系统栈是无限大的吗?肯定不是,递归深度达到一定量的时候会崩溃程序,还有有些算法用递归可能一直在重复运算,最明显的就是斐波那契数列,f(n)=f(n-)+f(n-2) 你这样其实一直在重复某些运算,是算法复杂度提升。所以是否要用递归需要具体情况具体分析。

1. 递归二分查找

二分查找也可以使用递归实现,二分查找就是每次我都把范围缩小当前的一半,简单来说就是128个数看中间值和目标数大小关系去掉一半变成64,之后再用中间的比看大小关系直到,找到最后一个,当然也可能在当前数列当中并不存在那就返回-1,经过我的陈述,你已经发现了,如果能用中间的数进行代表,说明了什么,最起码说明在序列当中必须有序,如果原始数据没序,必须进行排序,才可以使用二分法。

1. 二分查找的条件

那我们来分析一下 递归条件和基线条件。

递归条件: 只要我和当前数比了 大了,小了 我就把寻找范围缩短一半,放在下个函数继续调用
基线条件 这个条件表示的是达到什么情况下我就停止,要不然就是无限循环了或者栈溢出,我们设数列的起始索引为start,终点索引为end,必然有start<end,如果start>end 那便是终止条件或者说基线条件当中的没找到,如果mid处的值刚好得到目标值,那便是命中的基线条件。目标代码如下:

def erfen(a,mubiao,start,end):if start>end:return -1else:mid=(start+end)//2if(a[mid]==mubiao):return midelif a[mid]>mubiao:end=mid-1elif a[mid]<mubiao:start=mid+1return erfen(a,mubiao,start,end)a=[1,2,3,4,5,6]
while(True):m=int(input())print(erfen(a,m,0,len(a)-1))
1. 二分查找的意义

假设原始数据1024个是有序情况,你用顺序查找最坏的情况要查找1024次,而用二分查找最坏的次数为10次,数据量越大,在有序的情况下二分查找越有利 log2 n

假设原始数据1024个是无序情况,你用顺序查找最坏的情况要查找1024次,而用二分查找首先要排序,我们简单算,是近似数(或者说增长的幅度),不是准确数,用快排排序,就是n*log2 n 排序次数大概 10240,再加上查找的次数10次,查找的次数反而好像更多了,但是排序是一次性就能搞定的,当你很多次查找的时候,总次数 排序加二分还是少的。所以在做算法题的时候还是要用排序 加二分方法。

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

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

相关文章

新版MQL语言程序设计:策略模式的原理、应用及代码实现

文章目录 一、什么是策略模式二、策略模式的实现原理三、策略模式的应用场景四、策略模式的代码实现 一、什么是策略模式 策略模式是一种行为型设计模式&#xff0c;它允许在运行时根据不同的情况选择算法的行为。该模式将算法封装成独立的类&#xff0c;并使它们可以互相替换&…

web3之跨链合成资产交易协议LINA (Linear)

什么是lina 官方网站&#xff1a;https://linear.finance/ Website: https://linera.io Discord: https://discord.gg/linera Medium: https://medium.com/linera Developer Docs: https://linera.dev Whitepaper: https://linera.io/whitepaper Linear Finance是首个跨链兼容…

会声会影绿幕抠图操作方法 会声会影绿幕抠图有绿色残边 绿幕抠图视频有绿边怎么处理 抖音怎么剪辑视频 视频剪辑软件推荐

科幻片里真的存在怪兽吗&#xff1f;外太空的画面是直接将演员放入太空拍摄的吗?其实这些不切实际的画面是通过绿幕拍摄实现的。你只需要在绿幕前拍一段太空漫步的视频&#xff0c;再利用会声会影的抠图功能就能实现&#xff01;如果你还不会绿幕抠图&#xff0c;我今天就手把…

《杨绛传:生活不易,保持优雅》读书摘录

目录 书简介 作者成就 书中内容摘录 良好的家世背景&#xff0c;书香门第为求学打基础 求学相关 念大学 清华研究生 自费英国留学 法国留学自学文学 战乱时期回国 当校长 当小学老师 创造话剧 支持钱锺书写《围城》 出任震旦女子文理学院的教授 接受清华大学的…

C/C++ 关于 SHA256 的使用

如下图&#xff0c;是关于 SHA256 使用的一个经典例子 #include <openssl/sha.h> #include <stdio.h> #include <string.h>int main() {char data[] "Hello, world!"; // 要计算哈希的数据unsigned char hash[SHA256_DIGEST_LENGTH]; // 用于存储…

扑克牌大小(模拟)

题目 import java.util.Scanner; public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String s sc.nextLine();String[] ss s.split("-");StringBuffer s1 new StringBuffer();StringBuffer s2 new StringBuffer(…

C++函数对象-运算符函数对象 - 逻辑运算 - 实现 x y 的函数对象 (std::logical_and)

任何定义了函数调用操作符的对象都是函数对象。C 支持创建、操作新的函数对象&#xff0c;同时也提供了许多内置的函数对象。 运算符函数对象 C 针对常用的算术和逻辑运算定义了很多函数对象&#xff1a; 逻辑运算 实现 x && y 的函数对象 std::logical_and templa…

关于基因结构注释,我的一些折腾和思考

我在2018年,写过一篇《如何对基因组序列进行注释》,简书上有4万多人阅读,CSDN上有8万多人阅读,说明确实有不少人有相关的需求。我自己也琢磨了一段时间,刚好过年回家,简单的梳理一下。 最初的时候,我的思路就是EvidenceModeler(后面简称EVM)的思路,训练不同从头预测…

微服务学习 | Spring Cloud 中使用 Sentinel 实现服务限流

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站https://www.captainbed.cn/kitie。 目录 前言 通过代码实现限流 定义资源 通过代码定义资源 通过注解方式定义资源 定义限流规则 通过…

nginx 配置404 页面

自己定义404 页面&#xff0c;通过 nginx 配置一下&#xff0c;重新定向 1. http 里面添加配置 proxy_intercept_errors on; fastcgi_intercept_errors on; 2. server 中添加配置 error_page 500 502 503 504 /404.html;error_page 404 /404.html;location /404.html…

cximage在vs2013下使用方法

1.下载源码 Cximage源码官网 CxImage download | SourceForge.net 下载最新版本 702版本 Download cximage702_full.7z (CxImage) 2.编译 vs2013打开CxImageFull_vc10.sln 这个源码版本是vc10的版本&#xff0c;所以vs2013会自动更新项目 因为cximage需要在后面的项目中使…

Nginx实战:2-日志配置

目录 前言 一、访问日志 1.字段配置 2.日志配置 3.默认配置 二、错误日志 前言 Nginx是一款高性能的HTTP和反向代理服务器&#xff0c;同时也是一个IMAP/POP3/SMTP服务器。在Nginx的日常使用中&#xff0c;日志记录是非常重要的一部分&#xff0c;它可以帮助我们监控服务…

2月7日《CS2》终于放大招,玩家激情再次被点燃

2024.2.7号&#xff0c;也就是昨天&#xff0c;V社终于放了大招&#xff0c;对CS2做了高达5个多G的大更新&#xff0c;这次更新内容还是比较多的&#xff0c;说几个比较有意思的点吧。 1、新武器箱&#xff1a;千瓦武器箱&#xff01; 全新的武器箱千瓦箱&#xff0c;能开出全…

java 回答问题

1. How do you create a variable with the numeric value 5? int x 5; 2. The value of a string variable can be surrounded by single quotes. False 3. Which method can be used to return a string in upper case letters? toUpperCase()

AutoSAR(基础入门篇)5.4-Autosar_汽车ECU项目的开发流程

目录 前言 一、团队介绍 二、AutoSAR开发流程 前言 项目的基础入门篇终于是要讲完了(后面可能还有一些补充内容)。大家耐着性子能看到这里也是真心不容易,AutoSAR很多内容都是理论上的东 西,还需要多加实践。所以如果你能认真看完前面的内容,并加以理解,那么我相信再看…

Netty应用(一) 之 NIO概念 基本编程

目录 第一章 概念引入 1.分布式概念引入 第二章 Netty基础 - NIO 1.引言 1.1 什么是Netty&#xff1f; 1.2 为什么要学习Netty&#xff1f; 2.NIO编程 2.1 传统网络通信中开发方式及问题&#xff08;BIO&#xff09; 2.1.1 多线程版网络编程 2.1.2 线程池版的网络编程…

搭建yum仓库服务器

安装 1.安装linux 1.1安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 1.2下载 cd /opt/nginx wget http://nginx.org/download/nginx-1.25.3.tar.gz 1.3解压 tar -xvf nginx-1.25.3.tar.gz 1.4配置 cd nginx-1.25.3 ./configure --pre…

FTP 文件传送协议

目录 1 文件传送协议 FTP 1.1 FTP 的基本工作原理 FTP 特点 主进程的工作步骤 两个连接 两个不同的端口号 NFS 采用另一种思路 1.2 简单文件传送协议 TFTP TFTP 的主要特点 TFTP 的工作&#xff08;很像停止等待协议&#xff09; 1 文件传送协议 FTP 文件传送协议 …

Redisson分布式锁 原理 + 运用 记录

Redisson 分布式锁 简单入门 pom <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.6</version></dependency>配置类 package com.hmdp.config;import org.redisson.Redisson;…

NLP_引入注意力机制

文章目录 点积注意力创建两个张量x1和x2计算张量点积&#xff0c; 得到原始权重对原始权重进行归一化求出注意力分布的加权和 缩放点积注意力编码器-解码器注意力定义Attention类重构Decoder类重构Seq2Seq类可视化注意力权重 注意力机制中的 Q、K、V自注意力多头自注意力注意力…