当前位置: 首页 > news >正文

python笔记Ⅵ--函数、函数的参数

一、函数简介

    函数也是一个对象(对象是内存中专门用来存储数据的一块区域)。函数可以用来保存一些可执行的代码,并且可以在需要时,对这些语句进行多次的调用。

创建函数:

def 函数名([形参1,形参2,...形参n]):
            代码块

函数名必须要符合标识符的规范:可以包含字母数字下划线,但是不能以数字开头

    函数中保存的代码不会立即执行,需要调用函数代码才会执行。定义函数一般都是要实现某种功能的。   

调用函数:

        函数对象()

例1:

# 定义一个函数
def fn() :
    print('这是我的第一个函数!')
    print('hello')
    print('今天天气真不错!')

# 打印fn
print(fn) <function fn at 0x03D2B618>
print(type(fn)) <class 'function'>

其中,fn是函数对象  fn()调用函数;

           print是函数对象 print()调用函数。

例2:

# 定义函数时指定形参
def fn2(a , b) :
    # print('a =',a)
    # print('b =',b)
    print(a,"+",b,"=",a + b)

# 调用函数时,来传递实参
fn2(10,20)
fn2(123,456)

二、函数的参数

    在定义函数时,可以在函数名后的()中定义数量不等的形参, 多个形参之间使用 , 隔开。

1、形参(形式参数):定义形参就相当于在函数内部声明了变量,但是并不赋值。

     定义形参时,可以为形参指定默认值,指定了默认值以后,如果用户传递了参数则默认值没有任何作用;如果用户没有传递,则默认值就会生效。

2、实参(实际参数)
      如果函数定义时,指定了形参,那么在调用函数时也必须传递实参,实参将会赋值给对应的形参,简单来说,有几个形参就得传几个实参

# 定义一个函数
# 定义形参时,可以为形参指定默认值
# 指定了默认值以后,如果用户传递了参数则默认值没有任何作用
#   如果用户没有传递,则默认值就会生效
def fn(a = 5 , b = 10 , c = 20):
    print('a =',a)
    print('b =',b)
    print('c =',c)

(1)实参的传递方式: 

  ① 位置参数:就是将对应位置的实参复制给对应位置的形参。

  第一个实参赋值给第一个形参,第二个实参赋值给第二个形参......

fn(1 , 2 , 3)

  ② 关键字参数:可以不按照形参定义的顺序去传递,而直接根据参数名去传递参数

fn(b=1 , c=2 , a=3)
print('hello' , end='') # 自动换行

注意:位置参数和关键字参数可以混合使用。混合使用关键字和位置参数时,必须将位置参数写到前面。

fn(1,c=30) # 1赋值给a

例1:

     函数在调用时,解析器不会检查实参的类型。也就是说,实参可以传递任意类型的对象

def fn2(a):
    print('a =',a)

# 函数在调用时,解析器不会检查实参的类型
# 实参可以传递任意类型的对象
b = 123
b = True
b = 'hello'
b = None
b = [1,2,3]
fn2(b)
fn2(fn)  # 这里函数传递的参数可以是fn()函数,这时a = <function fn at 0x000001DAA86FA170>

 例2:

def fn4(a):
    # 在函数中对形参进行重新赋值,不会影响其他的变量
    # a = 20
    # a是一个列表,尝试修改列表中的元素
    a[0] = 30
    print('a =',a,id(a))

c = 10   
c = [1,2,3] 

# fn4(c)
# fn4(c.copy()) # 浅复制,这里传递的是c对应列表的副本
# fn4(c[:]) # 切片,从头到尾的把值留下

# print('c =',c,id(c))

注意:

 ① 在函数中对形参进行重新赋值,不会影响其他的变量,所以c还是10。

 ② 如果形参执行的是一个对象,当我们通过形参去修改对象时,会影响到所有指向该对象的变量。

3、不定长参数

(1)在定义函数时,可以在形参前边加上一个 * ,这样这个形参将会获取到所有的实参,它将会将所有的实参保存到一个元组中。

 ① *a 会接受所有的位置实参,并且会将这些实参统一保存到一个元组中(装包)

def fn(*a):
    print("a =",a,type(a))

 ② 带星号的形参只能有一个。带星号的参数,可以和其他参数配合使用。

def fn2(a,b,*c):
    print('a =',a)
    print('b =',b)
    print('c =',c)
fn2(1,2,3,4,5)

  第一个参数给a,第二个参数给b,剩下的都保存到c的元组中。

 ③ 可变参数不是必须写在最后,但是注意,带*的参数后的所有参数,必须以关键字参数的形式传递。

def fn2(a,*b,c):
    print('a =',a)
    print('b =',b)
    print('c =',c)
fn2(1,2,3,4,c=5)

  第一个参数给a,剩下的位置参数给b的元组,c必须使用关键字参数

 ④ 所有的位置参数都给a,b和c必须使用关键字参数。

def fn2(*a,b,c):
    print('a =',a)
    print('b =',b)
    print('c =',c)
fn2(1,2,3,b=4,c=5)

 ⑤ 如果在形参的开头直接写一个*,则要求我们的所有的参数必须以关键字参数的形式传递。

def fn2(*,a,b,c):
    print('a =',a)
    print('b =',b)
    print('c =',c)
fn2(a=3,b=4,c=5)

 ⑥ *形参只能接收位置参数,而不能接收关键字参数。

def fn3(*a) :
     print('a =',a)
fn3(b=1,d=2,c=3) # 会报错

(2)**形参可以接收其他的关键字参数,它会将这些参数统一保存到一个字典中,字典的key就是参数的名字,字典的value就是参数的值。

 ①  **形参只能有一个,并且必须写在所有参数的最后

def fn3(b,c,**a) :
    print('a =',a,type(a))
    print('b =',b)
    print('c =',c)

fn3(b=1,d=2,c=3,e=10,f=20)

(3)参数的解包(拆包)

   ① 传递实参时,也可以在序列类型的参数前添加 * ,这样他会自动将序列中的元素依次作为参数传递。这里要求序列中元素的个数必须和形参的个数的一致

def fn4(a,b,c):
    print('a =',a)
    print('b =',b)
    print('c =',c)

# 创建一个元组
t = (10,20,30)

fn4(*t)

② 通过 ** 来对一个字典进行解包操作。

# 创建一个字典
d = {'a':100,'b':200,'c':300}
# 通过 **来对一个字典进行解包操作
fn4(**d)

相关文章:

  • NOA市占率超50%+影子模式,这家中国车企走出一条不寻常道路
  • 项目经理带团队,这6个坑一定要避开
  • 新手小白适合做哪个跨境电商平台?测评自养号能带来哪些收益及优势?
  • 网站SEO规范
  • Linux云服务器:MySQL安装失败、多种错误总结 | 个人解决参考
  • DockerHub 镜像仓库原理
  • Java 同步工具与组合类的线程安全性分析
  • springcloud之feign使用
  • Git的基本使用(用户初始化配置、新建代码库、把文件提交到缓存区、把文件提交到本地仓库等)
  • node切换后没有npm功能
  • uniapp AES加密解密
  • 第二届邯郸钢铁展会,图扑软件荣获“2022钢铁行业智造之星奖”
  • 第三届国际品质节,群硕企业与OI产品共同获奖
  • JSP琴行管理系统myeclipse开发mysql数据库bs框架java编程web网页结构
  • 智能座舱:汽车雷达的下一个战场
  • [译]Python中的类属性与实例属性的区别
  • 【RocksDB】TransactionDB源码分析
  • Bytom交易说明(账户管理模式)
  • CODING 缺陷管理功能正式开始公测
  • exports和module.exports
  • js
  • k8s如何管理Pod
  • Less 日常用法
  • Node + FFmpeg 实现Canvas动画导出视频
  • python学习笔记 - ThreadLocal
  • Theano - 导数
  • 大主子表关联的性能优化方法
  • 当SetTimeout遇到了字符串
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • 详解移动APP与web APP的区别
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 由插件封装引出的一丢丢思考
  • 在Docker Swarm上部署Apache Storm:第1部分
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​2020 年大前端技术趋势解读
  • ###STL(标准模板库)
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (3)llvm ir转换过程
  • (附源码)计算机毕业设计ssm电影分享网站
  • (强烈推荐)移动端音视频从零到上手(上)
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • ./configure,make,make install的作用
  • .net core 控制台应用程序读取配置文件app.config
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET 设计模式—简单工厂(Simple Factory Pattern)
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET国产化改造探索(三)、银河麒麟安装.NET 8环境
  • .net和jar包windows服务部署
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @FeignClient注解,fallback和fallbackFactory