Python3学习(六):函数

2023-10-26

Python3 函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。


可以通过 函数名.__doc__ 的方式来显示函数的说明文档,感觉这个如果在阅读比较大的程序时应该会有用,同时也在提示自己在写函数时注意添加文档说明。

def func(a, b):
    """
    这是自定义说明文档。
    只搬代码,不看文档,出事概不负责。
    """
    return a + b

print(func.__doc__)

运行结果:

这是自定义说明文档。
只搬代码,不看文档,出事概不负责。

定义一个函数
  1. 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  2. 函数内容以冒号起始,并且缩进。
  3. return [exp] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
    一般语法:
def fname():
	funcbody

计算圆柱体的体积

import math

def calcv(r, h):
    s = math.pi * r * r
    v = s * h
    return v

r = int(input("请输入半径r:"))
h = int(input("请输入高度h:"))

print("圆柱体的体积是:{:.2f}".format(calcv(r, h)))
指定函数参数和返回值类型

在编写函数的过程中,可以显式指定函数的参数类型及返回值类型:

def function_demo(param_A: int, param_B: float, param_C: list, param_D: tuple) -> dict:
    pass

参数传递

在 python 中,类型属于对象,变量是没有类型的:

a = [1,2,3]
a = "Test"
  • [1,2,3] 是 List 类型,“Test” 是 String 类型,而变量 a 是没有类型的。
  • a仅仅是一个对象的引用(一个指针),可以是指向 List 类型对象,也可以是指向 String 类型对象。
可更改(mutable)与不可更改(immutable)对象:
  • python 中一切都是对象(万物皆对象),严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。

  • 在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。

  • 函数内可以访问全局变量,但不能更新(修改)其值!

  • 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变 a 的值,相当于新生成了 a。

  • 可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。

不可变变量传入到函数中进行操作,不会改变原来变量的值。
可变变量传入到函数中进行操作,会改变值。

传不可变变量 - numbers测试:

def change(a):
    print(id(a))
    a = 10
    print(id(a))

a = 5
print(id(a))
change(a)
print(id(a))
print(a)

运行结果:

140714583267104
140714583267104
140714583267264  -> 函数内生成的a,不会对外界产生影响
140714583267104
5

传可变变量 - list测试:

def change(list):
    print(list)
    for i in list:
        print(id(i))
    list.append([4,5,6])
    return

list = [1,2,3]
print(list)
for i in list:
    print(id(i))
change(list)
print(list)
for i in list:
    print(id(i))

运行结果:

[1, 2, 3]
140714583266976
140714583267008
140714583267040
[1, 2, 3]
140714583266976
140714583267008
140714583267040
[1, 2, 3, [4, 5, 6]]
140714583266976
140714583267008
140714583267040
1428048819776

参数

以下是调用函数时可使用的正式参数类型:

  • 必需参数
  • 关键字参数
  • 默认参数
  • 不定长参数
  1. 必需参数
    必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样
def sumN(a, b):
	return (a + b)

sumN(1, 2)
  1. 关键字参数
    – 关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。
    – 使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
def printme( str, age ):
   print (str)
   print(age)
   return
 
printme( str = "小陈是猪", age = 10)

输出:

小陈是猪
10
  1. 默认参数
    调用函数时,如果没有传递参数,则会使用默认参数。以下实例中如果没有传入 age 参数,则使用默认值
    注意:默认参数必须放在形参的最后面,否则会报
def printinfo( name, age = 35 ):  #这是设置默认age值为35
   print ("名字: ", name)
   print ("年龄: ", age)
   return
 
printinfo( age=50, name="小陈" )
printinfo( name="小陈" )
  1. 不定长参数
    – 当需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述参数不同,声明时不会命名。
    – 形参前加*号,可以传入多个参数,也可以不写参数。
def functionname([formal_args,] *var_args_tuple ):
   function_suite
   return [expression]

加了 星号* 的参数会以元组(tuple) 的形式导入,存放所有未命名的变量参数。

def func2(name, *score):
    print("姓名:",name)
    sum = 0
    print("各科成绩:",score)
    for i in score:
        sum += i
    print("总分:",sum)

func2("小陈",99,88,77)

运行结果:

姓名: 小陈
各科成绩: (99, 88, 77)
总分: 264

还有一种就是参数带两个星号 **基本语法如下:

def functionname([formal_args,] **var_args_dict ):
   function_suite
   return [expression]

加了两个星号 ** 的参数会以字典的形式导入,把N个关键字参数转化为字典。

def printinfo(arg1, **vardict):
    print("输出: ")
    print(arg1)
    print(vardict)

printinfo(1, a=2, b=3)

输出:

1
{'a': 2, 'b': 3}
特殊用法:
  • 如果参数中单独出现星号 *,其后的参数必须用关键字传入
  • 如果参数中出现了反斜杠/,其前的参数必须用指定位置参数,也称作强制位置参数
def test4me(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)

test4me(11, 22, 33, 44, e=55, f=66)

匿名函数

python 使用 lambda 来创建匿名函数。所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。

  • lambda 只是一个表达式,函数体比 def 简单很多。
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
  • lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。

语法:

lambda [arg1 [,arg2,.....argn]]:expression
sum = lambda arg1, arg2: arg1 + arg2

list1 = [1, 2, 3]
list2 = ['a', 'b', 'c']

print(sum(list1, list2))
print(sum("Whose ", "there?"))
print(sum(arg1=2, arg2=3))

运行结果

[1, 2, 3, 'a', 'b', 'c']
Whose there?
5

return语句
  • return [expression] 语句用于退出函数,选择性地 向调用方返回一个表达式。不带参数值的return语句返回None。
  • 函数返回值的注意事项: 不同于 C 语言,Python 函数可以返回多个值,多个值以元组的方式返回:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python3学习(六):函数 的相关文章

随机推荐

  • IDEA的配置JDK,Tomcat,Maven

    IDEA的配置JDK Tomcat Maven 先下载安装jdk 其中JDK为安装版 tomcat 和maven为非安装版 JDK安装完成后要设置3个坏境变量 tomcat和maven好像不设置也行 就下载下来解压就行了 maven最好还是
  • 小米android11账号补丁,小米10 MIUI11 解账户锁 可登小米账号 永不反锁 完美ROOT 解锁包...

    MIUI全机型有锁机账户锁刷机包 仅针对于有锁机用户使用 帮助已经购买到有锁机的用户 ROM版权归小米 官方所有 本人未持有任何版权 仅以分享形式发布 对ROM稳定性也不能做任何保证 如果你希望更好的系统 体验 我们非常建议购买正规渠道的小
  • 用Construct2开发一个小游戏(进阶)

    策划并用Construct2开发一个小游戏 进阶 游戏策划 楔子 Setting 公元2500年 与地球建交长达200之久的达克星球 Dark Star 单方面撕毁友好合约 对地球发起了进攻 面对源源不断的独眼怪大军 你踏入自己发明的 洋芋
  • MATLAB——读取多文件夹内文件并绘制图形(1)——逐行读取txt文件内字符串

    目录 1 添加路径 2 准备好图片名称和路径名称 3 读取txt文件中的字符串 1 添加路径 如果m文件和要读取的文件不在同一个路径下 需要借助下方代码将当前文件夹下的所有文件都包含进搜索路径中 addpath genpath F SaCo
  • Swin-Transformer

    原视频链接 https www bilibili com video BV1pL4y1v7jC spm id from 333 788 vd source f04f16dd6fd058b8328c67a3e064abd5 参考博文 2021
  • 哈夫曼编码设计(C)

    文章目录 前言 哈夫曼编码设计 总结 前言 大二 刚刚开始学数据结构与算法 写得不好 哈夫曼编码设计 现要求输入8个字符 a b c d e f g h 对应的权值 大于0的整数 然后设计哈夫曼编码实现输入对应8个字符组成的一串字符 字符串
  • centos 网络连接设置

    这里使用虚拟机 VirtualBox 来安装CentOS 6 3 32bit服务器版本 没有安装桌面 作为演示 所以全是命令操作 如何安装CentOS操作系统就不用我说的 虚拟机网络设置为桥接模式 Bridge 单独分配ip 不共享主机ip
  • 致命错误:Rdefines.h:没有那个文件或目录

    致命错误 Rdefines h 没有那个文件或目录 Rdefines h No such file or directory 关键词 CentOS 7 安装rpy2 pip3 install rpy2报错 python3 setup py
  • C#——字符串

    System String类 1 创建字符串 string s abcdefg 2 获取字符串长度 s Length 3 比较字符串是否一样 s abcd 4 字符串连接 s http s 5 使用类似索引器的语法来取得字符串中的某个字符
  • Android常见漏洞

    Android常见漏洞 漏洞名称 Log敏感信息泄露 漏洞描述 程序运行期间打印了用户的敏感信息 造成泄露 修改建议 建议禁止隐私信息的log 漏洞名称 web https校验错误忽略漏洞 漏洞描述 漏洞可导致中间人攻击 修改建议 建议不要
  • JAVA基础练习题

    1 生成两个1 10的随机数 分别作为两个数组的长度 2 向第一个数组中以循环键盘录入的方式添加元素 3 生成1 100之间的随机数 为第二个数组的每个元素赋值 4 将两个数组合并 为一个新的数组 5 去掉新数组的最大值和最小值 求平均值
  • vue之--使用TypeScript

    搭配 TypeScript 使用 Vue 像 TypeScript 这样的类型系统可以在编译时通过静态分析检测出很多常见错误 这减少了生产环境中的运行时错误 也让我们在重构大型项目的时候更有信心 通过 IDE 中基于类型的自动补全 Type
  • C++ 好用的日志库--spdlog

    背景 spdlog 是一个快速 异步的 header only 的 C 日志库 它提供了简单易用的 API 并具有高性能和可扩展性 下载和使用 下载 spdlog 库下载地址 github 链接 hello world 在使用时只需要 in
  • 设计模式:模板方法模式

    定义一个操作中算法的框架 而将一些步骤延迟到子类中 使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤 类图如下 事实上 模版方法是编程中一个经常用到的模式 先来看一个例子 某日 程序员A拿到一个任务 给定一个整数数组 把数组中的
  • 常用的函数式接口

    1 Supplier接口 仅包含一个无参的方法 T get 用来获取一个泛型参数指定类型的数据 2 Consumer接口 包含抽象方法 void accept T t 正好与Supplier相反 它不是生产一个数据 而是 消费一个数据 其数
  • web安全--环境搭建

    1 搭建环境 下载owasp靶机测试环境 login root password owaspbwa 下载kali linux攻击机也可以使用windows作为攻击机 我的是2020 login kaili password kali 其他版
  • typescript学习(二)——函数

    一 函数的定义 1 函数声明法 规定返回值必须为string类型 function run string return im string 2 匿名函数法 let run function string return im string 没
  • uniapp实现下拉加载更多 u-loadmore

    区别于官网教程 这里总结更为白话 要实现的需求是 比如起初有十条数据 下拉至底部 追加某数量的数据 比如我的项目中 我把它放在了数据展示的底部 上代码
  • 微信支付踩坑记-签名错误,请检查后再试

    注册商户号 使用微信支付功能 直接无脑设置v3密钥 然后配合wxjava这个包进行开发 结果试了很多遍 都报错 最后才发现 我一直使用的v2验证方式 之前都没有设置过v2密钥 最后把v2密钥设置成和v3一样 重新试了一下 解决问题 最后附上
  • Python3学习(六):函数

    Python3 函数 函数是组织好的 可重复使用的 用来实现单一 或相关联功能的代码段 函数能提高应用的模块性 和代码的重复利用率 你已经知道Python提供了许多内建函数 比如print 但你也可以自己创建函数 这被叫做用户自定义函数 可