Python基础(五)—函数(参数解析、global、递归)

告别环境配置焦虑:在Win10的Ubuntu子系统里搞定CSAPP实验环境(附32/64位库编译指南) 本文详细介绍了如何在Win10的Ubuntu子系统中搭建CSAPP实验环境,包括WSL 2的安装与配置、32/64位库的编译指南以及高效开发工具链的设置。通过优化WSL性能和使用实用技巧,开发者可以轻松应对CSAPP实验中的环境配置问题,提升学习效率。 阅读详情

形参和实参

形参即函数内使用的参数,实参即调用函数时的赋值,如下:

  def tmp(name):  # 形参
  	print(name)
  
  tmp('实参')

形参类型

  • 位置参数
    函数内使用到的形参为关键参数,即调用该函数时必须传入的参数。

  • 默认参数
    如:tmp(name=‘lz’,age),此时形参name即为默认参数,默认值为lz。

  • 可变参数
    如:tmp(*params),此时传入的参数可以为任意个参数,接收的是一个tuple()

  • 关键字参数
    如:tmp(**params),接受的是一个dict{}

  • 命名关键字参数
    如:tmp(name, age, , sex),此时后的sex即为命名关键字参数,也就是调用时必须sex=’’,tmp(‘name’, ‘age’, sex=‘man’);若是tmp(name, age, *, sex=‘man’),此时调用是可以不传入sex参数。

除了可变参数无法与命名关键字参数混合,其余皆可混合使用,但是定义的顺序必须为:必选参数、默认参数、可变参数\命名关键字参数、关键字参数。

  def tmp(*params, name='lz', age='24'):
      for param in params:
          print('param:' + param)
  	print(name)
  	print(age)

  tmp(11, name='ss',age='22')  
  """
  	1.在调用含有可变参数的函数时,在可变参数后的形参进行设置默认值。
  	2.在调用函数时,尽量将调用函数内的参数写为:形参=实参,这样增加代码的可读性,也使得增加函数调用的准确性。
  """

函数和过程

函数是用返回值的,过程是没有返回值的。**对于python严格来说,只有函数,没有过程!
函数也可以有多个返回值。
如下个例子:

  def hello():
  	print('hello python')

  tmp = hello()
  print(tmp)  # None
  print(type(tmp))  # <class 'NoneType'>

  # 返回多个至
  def returnTmp(name, age):
      return '名字:' + name, '年龄:' + str(age)

  name, age = returnTmp('lz', 24)

  print(name, age)  #名字:lz 年龄:24

可以看出函数都是用返回值的。这是因为python都是动态的确定变量类型,其实就是没有变量,只有名字。

全局变量和局部变量

函数内的即局部变量,函数外的即为全局变量,函数外访问局部变量会出错。
函数可以访问全局变量,但不要试图去修改全局变量,因为在函数内修改全局变量的话,python会在该函数新定义一个名字一样的局部变量。

  def tmp():
      print(g_name)  # 报错UnboundLocalError: local variable 'g_name' referenced before assignment,如果不加:g_name = 'lz1',则不报错
      g_name = 'lz1'
      print(g_name)

  g_name = 'lz'
  tmp()
  print(g_name)
  # lz1
  # lz

global关键字

如果在函数内部试图修改全局变量,Python会使用屏蔽的方式(shadowing机制)去保护全局变量,即创建该函数内的同名的局部变量,所以这样就算修改,也只是修改了函数创建的局部变量,而全局变量却没有改变。
global关键字提供了函数内修改全局变量的方法。

 name = 'lz'
 def tmp():
     global name
     name = 'lzz'

 tmp()
 print(name)  # lzz,成功修改

递归

  • 递归形成有两个条件:

    • 必须有一个明确的结束条件(递归出口);
    • 每次递归都是为了让问题规模变小

    递归其实就是分治思想。而递归层数一旦过多会导致栈溢出,并且相对循环,递归效率差很多。所以只是合适的地方使用递归,而不是每个能递归的问题都是用递归。
    以下直接使用一个递归与非递归的斐波那契数列的例子,来表达递归及两者之间的效率差别。

  # 如果设置成35甚至更大,迭代结果立即出来,而递归则很慢
  def fab(n):
      n1 = 1
      n2 = 1
      n3 = 1
      if n < 1:
          print('输入有误')
          return -1
      while (n - 2) > 0:
          n3 = n2 + n1
          n1 = n2
          n2 = n3
          n -= 1
      return n3
  print(fab(20))

  def fab_recursion(n):
      if n < 1:
          return -1
      if n == 1 or n == 2:  # 结束条件
          return 1
      else:
          return fab(n-1) + fab(n-2)  #缩小问题
  print(fab_recursion(20))  

  • 汉诺塔
    汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

    • 汉诺塔问题解释
      我们假设三个指针为 A、B、C
    • hanoi(1):如果只有一个盘子,直接A->C
    • hanoi(2,A,B,C):如果两个盘子,即:A->B,A->C,B->C
    • 如果三个盘子,即:hanoi(2,A,C,B),A->C,hanoi(2,B,A,C)
      因此如果是n个盘子,就是这样的过程:hanoi(n-1,A,C,B),A->C,hanoi(n-1,B,A,C)
    • 代码实现:
      根据以上分析,可以得到以下代码:
     def hanoi(n, A, B, C):
         if n == 1:
             print(A, '->', C)
         else:
             hanoi(n - 1, A, C, B)
             print(A, '->', B)
             hanoi(n - 1, B, A, C)
    
     hanoi(3, 'A', 'B', 'C')
    

个人博客:Loak 正 - 关注人工智能及互联网的个人博客
文章地址:Python基础(五)—函数(参数解析、global、递归)

矩阵束(Matrix Pencil)入门:从通信系统到控制理论,它为何是建模利器? 本文深入探讨矩阵束(Matrix Pencil)在通信系统与控制理论中的关键作用,揭示其作为复杂系统建模利器的独特价值。从MIMO系统的多径干扰分析到电力系统稳定性判据,矩阵束通过`A-λB`方程求解提供精准建模方案,显著提升5G通信和工业控制等领域的性能表现。 阅读详情

相关推荐

pgpool-II安装部署

文章介绍了pgpool-II的核心功能、架构组成以及实际部署的关键配置步骤

weixin_41690116的博客 1427

python笔记-global/多维数组/递归

1.global变量的初始值要放在函数外或者类外赋值,不能在函数内或者类内赋值,在函数内或者类内使用global变量前声明为global变量才能使用; 如果global声明和变量的初始值都放在函数外或者类外赋值,在函数内或者类内的同名变量没有声明为global则就是一个新的局部变量,跟那个全局变量没有关系,在内部使用一定需要声明为global才用的是global变量。 global期望能是一个变动的值才有意义,所以初始值如果定义在函数内部是不合逻辑的,每次在函数内部调用的时候都被初始化了。 2.定义多维数组

qq_33411994的博客 1118

[OHIF-Viewers]医疗数字阅片-医学影像-cornerstone-core-Cornerstone.js-Cornerstone Examples-基石实例-下...

[OHIF-Viewers]医疗数字阅片-医学影像-cornerstone-core-Cornerstone.js-Cornerstone Examples-基石实例-下 CT Image with Window presets This is an example of displaying a ct image along with buttons to set ww/wc pres...

浩秦的博客 1842

python3:递归函数中使用global nonlocal

首先是一个最简单的计算阶乘的递归函数: def recuision(n): if(n == 1): return 1 else: return n * recuision(n-1) print(recuision(4)) 运行结果: 但现在有可能,你需要对每次调用递归时的n,进行一些记录: value = 0 li = [] def r...

anlian523的博客 3866

思科华三设备组网思科生成树PVST发BPDU导致全网闪断

一、故障现象 1.思科PVST BPDU报文导致全网闪断。 2.光衰低时不同品牌网络设备无法兼容导致接入交换机中断。 二、网络拓扑 图1 网络拓扑图 组网结构为H3C汇聚,接入交换机有思科,也有H3C,而且与汇聚直连的接入交换机下面串接了较多的交换机,或者hub。 三、排查思路 1.回忆一下最近做了什么事情,什么时候开始出的问题。 将网络汇聚交换机从思科换为H3C,H3C汇聚和思科接入对接出问题...

Silence_always的博客 7489

Time-Interleaved Analog-to-Digital Converters

  这篇论文提供了时间交错模数转换器的教程回顾。在解释了偏置、增益、定时和其他不匹配对变换器性能的影响后,给出了目前解决不匹配问题的方法。论文最后总结了时间交错模数转换器的现状。 1.简介   时间交错模数转换器(ADC)将多个子ADC组合成一个ADC系统,可以实现比单独的子ADC[1]更快的采样速率。历史上,时间交错adc的主要缺点是需要紧密匹配子adc[2]的特性。近年来,由于应用需要非常宽带信号的数字化、功率高效子adc的可用性以及由深亚微米互补金属氧化物硅(CMOS)技术实现的微调技术,使得时间交错

weixin_44537056的博客 6733

python 函数图解_Python函数说明(一)

一、函数函数定义:函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可在不同的机器语言中,函数名字的叫法不尽相同。在BASIC中叫做subroutine(子过程或子程序),在Pascal中叫做procedure(过程)和function,在C中只有function,在Java里面叫做method。函数形式:def func(kwargs,*kwargs,*...

weixin_39598094的博客 266

【Halcon】双目立体视觉引导机械手有序抓取,案例分享

本文介绍了一个基于双目视觉的工件定位与抓取系统。该系统使用两个工业相机组成双目视觉系统,通过标定获取相机参数,采用模板匹配算法识别任意摆放且可能交叠的工件。重点阐述了三维坐标获取方法,特别是通过Z方向高度实现有序抓取的策略。文章详细说明了系统搭建、双目标定、模板创建等关键步骤,并展示了特征点匹配和定位结果。该案例为初学者和开发者提供了双目视觉系统的基本实现参考,展示了机器视觉与机械手协同工作的典型应用场景。

机器视觉从业者 2490

关于python中的全局变量、局部变量及递归中的使用

本文主要总结python中的全局变量、局部变量和函数调用时的可变对象的使用: 1、关于全局变量和局部变量 (1)如果函数内无global关键字,优先读取局部变量,无局部变量则读取全局变量,不能对全局变量重新赋值。 name = 'jack' def change_name(): name = 'john' print(name) change_name() print(name...

简之的通向技术之路 8039

Kindle电子书DRM破解全攻略:从下载到转换的完整流程(含最新DeDRM插件配置)

本文详细介绍了2025年最新Kindle电子书DRM移除的完整实战流程。针对亚马逊加密机制的升级,文章重点讲解了如何配置最新的DeDRM插件、从新版Kindle客户端提取密钥,并利用Calibre完成电子书的解密与格式转换,为个人备份提供了一套可行的解决方案。

weixin_29279153的博客 1748

MicroBlaze系列教程(8):AXI_CAN的使用

Xilinx AXI CAN IP的初始化配置,主要包括波特率、过滤器、回调函数设置等等。

whik1194的博客 4547

Python的global语句使用

Python中定义函数时,若想在函数内部对函数外的变量进行操作,就需要在函数内部声明其为global。例子1x = 1def func(): x = 2func() print(x)输出:1 在func函数中并未在x前面加global,所以func函数无法将x赋为2,无法改变x的值例子2x = 1def func(): global x x = 2func() print(

xtingjie的博客 5万+

SpringAI系列 - MCP篇(二) - MCP Server Boot Starter

此处需注意之前的。

罗小爬的技术宝书 1322

python函数 global_python基础11_函数作用域_global_递归

看到了一个16进制转换的小知识点,就验证了一下运行结果.#!/usr/bin/env python#coding:utf-8#看到了16进制转换的问题。顺便验证一下。a = 255b= 1001print(hex(a), hex(b))c= 0xffd= 0x3e9print(int(c),int(d))继续往前走, 学习一下global关键字参考: http://www.pythonav.com...

weixin_39617484的博客 126

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Python基础语法(三):函数

对比点C++Python定义关键字无(直接写返回类型)def返回类型声明必须(intvoid等)不需要形参类型声明必须不需要函数体边界{ }缩进无返回值时voidreturn;省略 return,返回None先定义,再使用。定义只是"登记",函数体不会执行,必须调用才执行。调用几次,执行几次。

2502_94387000的博客 1174

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【Python】Python函数的黑魔法:递归,嵌套函数与装饰器

pass@decoratorpass其中,decorator 为装饰器。@decorator 为函数的装饰器修饰符。func 为装饰器的函数对象参数。装饰器可以返回一个值,也可以返回一个函数,还可以返回一个装饰器或其他对象。例如:装饰器返回一个值return 3print(result) # 输出 4代码解析:当调用时,实际上我们是在用装饰器,而替代了func装饰器中嵌套了wrapper()函数,并且返回值是wrapper,所以实际上我们就是调用了wrapper()

cilmy23的note 1737

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【Python零基础到进阶】递归,闭包,匿名函数

【Python零基础到进阶】递归,闭包,匿名函数

2301_78096295的博客 864

python eval函数 递归函数 嵌套函数 内部函数 数据隐藏 nonlocal和global LEGB规则

** 1,eval()函数 将字符串str当成有效的表达式来求值,并返回计算结果 ** 语法为: eval(source[,globals [,locals]]) —>value source :一个python表达式 或者 函数 compile()返回的代码对象 globals:可选 必须是dictionary locals:可选 任意映射对象 s = "print('abc')" ev...

嘎嘎_哈 525

lesson17:Python函数之递归、匿名函数与变量作用域

本文深入解析Python函数的三大核心特性:递归、匿名函数与变量作用域。递归函数通过自我调用来分解复杂问题,需设置基线条件和递归条件,但存在重复计算问题,可通过记忆化优化。匿名函数(lambda)以简洁的单行表达式实现轻量级逻辑,特别适用于高阶函数参数和简单回调。变量作用域遵循严格的LEGB规则(Local→Enclosing→Global→Built-in),通过global和nonlocal关键字可突破默认作用域限制。理解这些特性能够帮助开发者编写更优雅、高效的Python代码,避免常见作用域陷阱。

2402_82363599的博客 1243

第十二天学Python:函数(3)变量作用域、匿名函数与递归函数

经过昨天: 函数(2)变化参数.的铺垫,终于在函数第三节来到了难点,今天主要讲的内容是: 变量作用域全局变量与局部变量global:关键字nonlocal:关键字匿名函数递归函数二级目录三级目录 变量作用域 全局变量与局部变量 全局变量:全局变量在整个程序文件(.py)中声明,全局范围都可以调用它 局部变量:局部变量在某个函数内部声明,只能在这个函数内部调用 >>> i =...

k_ksy的博客 1598

Python函数基础与函数递归

数学中函数的定义: 一般的 在一个变化过程中, 如果有两个变量 x 和 y 并且 对于 x的每一个确定的值,y都有唯一确定的值与 其对应, 那么我们就把 x 成为 自变量 把y成为 因变量 y是x的函数。自变量x的取值范围叫这个函数的定义域 y = 2*x python 中函数 是一种逻辑结构化和过程化的一种变成方法python中函数定义的方法: 1 def test(x...

110

python基础——05函数

def fun(a)

2303_76544787的博客 856
上一篇: Python基础(四)—日期类型
下一篇: Python基础(六)—函数式编程(内部函数、闭包、lambda、filter/map/reduce/sorce、偏函数)
luoz_python
博客等级 码龄10年 57粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值