一 函数的概念

1.1 函数的含义

功能 (包裹一部分代码 实现某一个功能 达成某一个目的)

1.2 函数特点

可以反复调用,提高代码的复用性,提高开发效率,便于维护管理

1.3 函数的基本格式

  1. # 语法格式
  2. def 函数名():
  3. pass

简单示例

  1. # 函数的定义
  2. def func():
  3. print("函数简单示例")
  4.  
  5. # 函数的调用
  6. func()

执行

  1. [root@node10 python]# python3 test.py
  2. 函数简单示例

1.4 函数的命名规则

驼峰命名法

  1. (1)大驼峰命名法: MyWorld 每个单词首字符都是大写
  2. (2)小驼峰命名法: myWork 只有第一个单词首字符小写,剩下都大写
  3. 函数命名当中不做强制要求,但是对于类名来讲,建议使用大驼峰
  4. 函数命名: 一般如下: my_work , my_beatiful_girl

二 函数的参数

  1. (1)形参:形式参数 (在函数的定义处)
  2. (2)实参:实际参数 (在函数的调用处)
  3. 形式参数种类: 普通(位置)参数 默认参数 普通收集参数 命名关键字参数 关键字收集参数
  4. 实际参数种类: 普通(位置)实参 关键字实参
  5. 形参和实参数量要一一对应

2.1 普通形参

函数和定义处

  1. # 函数的定义处
  2. # hang 和 lie 就是形参: 普通(位置)形参
  3. def star(hang,lie):
  4. i = 0
  5. while i<hang:
  6. j = 0
  7. while j<lie:
  8. print("*",end="")
  9. j+=1
  10.  
  11. print()
  12. i+=1
  13. # 函数的调用处 10,10 就是实际参数: 普通实参
  14. star(10,10)

执行

  1. [root@node10 python]# python3 test.py
  2. **********
  3. **********
  4. **********
  5. **********
  6. **********
  7. **********
  8. **********
  9. **********
  10. **********
  11. **********

2.2 默认形参

  1. # hang 和 lie 就是形参: 默认形参 带有默认值
  2. def star(hang=10,lie=10):
  3. i = 0
  4. while i<hang:
  5. j = 0
  6. while j<lie:
  7. print("*",end="")
  8. j+=1
  9.  
  10. print()
  11. i+=1
  12. star()

执行

  1. [root@node10 python]# python3 test.py
  2. **********
  3. **********
  4. **********
  5. **********
  6. **********
  7. **********
  8. **********
  9. **********
  10. **********
  11. **********

给与实际参数时候,用自己的
没给与实际参数时,用默认形参的

  1. # hang 和 lie 就是形参: 默认形参 带有默认值
  2. def star(hang=10,lie=10):
  3. i = 0
  4. while i<hang:
  5. j = 0
  6. while j<lie:
  7. print("*",end="")
  8. j+=1
  9.  
  10. print()
  11. i+=1
  12. star(4,5)

执行

  1. [root@node10 python]# python3 test.py
  2. *****
  3. *****
  4. *****
  5. *****

一个参数,hang=4,默认lie=10

  1. # hang 和 lie 就是形参: 默认形参 带有默认值
  2. def star(hang=10,lie=10):
  3. i = 0
  4. while i<hang:
  5. j = 0
  6. while j<lie:
  7. print("*",end="")
  8. j+=1
  9.  
  10. print()
  11. i+=1
  12. star(4)

执行

  1. [root@node10 python]# python3 test.py
  2. **********
  3. **********
  4. **********
  5. **********

2.3 普通形参 + 默认形参

如果普通形参 + 默认形参都存在的情况下, 优先顺序,普通形参要跟在默认形参的前面;

  1. # hang 和 lie 就是形参: 默认形参 带有默认值
  2. def star(hang,lie=10):
  3. i = 0
  4. while i<hang:
  5. j = 0
  6. while j<lie:
  7. print("*",end="")
  8. j+=1
  9.  
  10. print()
  11. i+=1
  12. star() #不写参数会报错

执行

  1. # 写1个参数 hang = 4 lie =10
  2. # star(4)
  3.  
  4. # 写2个参数
  5. # star(3,3)

2.4 关键字实参

  1. [root@node10 python]# cat test.py
  2. # 函数的定义处
  3. def star(hang,lie=10):
  4. i = 0
  5. while i<hang:
  6. j = 0
  7. while j<lie:
  8. print("*",end="")
  9. j+=1
  10.  
  11. print()
  12. i+=1
  13.  
  14. # 函数的调用处
  15. # lie = 13 是关键字实参
  16. star(3,lie=13)

执行

  1. [root@node10 python]# python3 test.py
  2. *************
  3. *************
  4. *************

其他用法

  1. # hang = 3 ,lie = 5 是关键字实参
  2. star(hang = 3,lie =5)
  3. # 如果是关键字实参,顺序可以颠倒
  4. star(lie = 2,hang=3)

如果定义时,是普通形参 ,调用时,是关键字实参调用,那么跟在这个普通形参后面的所有参数,都需要使用关键字实参

  1. def star(hang,a1,a2,lie=10):
  2. i = 0
  3. while i<hang:
  4. j = 0
  5. while j<lie:
  6. print("*",end="")
  7. j+=1
  8.  
  9. print()
  10. i+=1
  11. # 函数的调用处
  12. # star(1,a1= 1,a2 = 3,lie = 18)
  13. star(1,lie=3,a1 = 4,a2=8)

执行

  1. [root@node10 python]# python3 test.py
  2. ***

三 收集参数

3.1 普通收集参数

(任意长度都可以接收)

语法

  1. def func(*args):
  2. pass

*args 就是普通收集参数 : * + 参数名字(名字自定义,一般约定俗成叫做args => arguments 参数的意思)

用途:专门用于收集多余的没人要的普通实参,都放到一个元组当中收集

  1. [root@node10 python]# cat test.py
  2. #函数的定义处 定义好收集参数args
  3. def func(a,b,c,*args):
  4. print(a,b,c)
  5. print(args)
  6.  
  7. # 函数的调用处
  8. func(1,2,3,4,5,56,6,7)

执行

  1. [root@node10 python]# python3 test.py
  2. 1 2 3
  3. (4, 5, 56, 6, 7)

计算任意长度的累加和

  1. def mysum(*args):
  2. total = 0
  3. for i in args:
  4. total += i
  5. print(total)
  6.  
  7. mysum(1,2,3,4,4,5)

执行

  1. [root@node10 python]# python3 test.py
  2. 19

3.2 关键字收集参数

语法

  1. def func(**kwargs):
  2. pass

**kwargs 就是关键字收集参数 : ** + 参数名字 (名字自定义,一般约定俗成叫做kwargs => keyword arguments 参数的意思)

用途:专门用于收集多余的没人要的关键字实参,都放到一个字典当中收集

  1. # 函数的定义处,定义关键字收集参数
  2. def myfunc(a,b,c,**kwargs):
  3. print(a,b,c)
  4. print(kwargs)
  5. # 函数的调用处
  6. myfunc(a=1,b=3,c=5,d=10,e=21)

执行

  1. [root@node10 python]# python3 test.py
  2. 1 3 5
  3. {'d': 10, 'e': 21}

拼接任意长度的字符串

  1. def myfunc2(**kwargs):
  2. dictvar = {"weiguo":"皇帝","shuguo":"皇叔"}
  3. str1 = ''
  4. str2 = ''
  5. # print(kwargs) # kwargs 是字典 {'weiguo': '曹操', 'shuguo': '刘备', 'wuguo': '孙权'}
  6. for k,v in kwargs.items():
  7. if k in dictvar:
  8. # print(k) # monitor clasflower
  9. str1 += dictvar[k] + ':' + v + '\n'
  10. # str1 += "曹操" + ":" + 刘备 + '\n'
  11. else:
  12. # 如果不符合条件,将是乱世奸雄名字拼接在一起
  13. str2 += v + ' '
  14.  
  15. print(str1,"乱世奸雄")
  16. print(str2,"吴国皇帝")
  17. myfunc2(weiguo="曹操",shuguo="刘备",wuguo="孙权")

执行

  1. [root@node10 python]# python3 test.py
  2. 皇帝:曹操
  3. 皇叔:刘备
  4. 乱世奸雄
  5. 孙权 吴国皇帝

3.3 命名关键字参数

语法

  1. (1)在函数的定义处,跟在*号后面的参数是命名关键字参数
  2. def func(参数1,参数2,*,参数3,参数4):
  3. pass
  4.  
  5. (2)夹在普通收集参数和关键字收集参数之间的参数是命名关键字参数
  6. def func(*args,参数1,参数2,**kwargs):
  7. pass
  8.  
  9. 这两种是命名关键字参数;
  10. 命名关键字参数在函数调用时,必须用关键字实参的形式调用(除非指定了默认值)

第一种写法

  1. def func(a,b,c,*,d):
  2. print(a,b,c)
  3. print(d)
  4.  
  5. # 函数的调用处 , 命名关键字必须指定关键字实参进行调用,否则报错
  6. func(1,2,3,d=4)

执行

  1. [root@node10 python]# python3 test.py
  2. 1 2 3
  3. 4

第二种写法

  1. # 函数的定义处
  2. def func(*args,b,c,**kwargs):
  3. print(args)
  4. print(kwargs)
  5. print(b,c)
  6.  
  7. # 函数的调用处
  8. func(1,2,3,4,a=1,b=2,c=3,d=4,f=5)

执行

  1. [root@node10 python]# python3 test.py
  2. (1, 2, 3, 4)
  3. {'a': 1, 'd': 4, 'f': 5}
  4. 2 3

命名关键字可以指定默认值

  1. def func(a,b,*,c=1,d=2):
  2. print(a,b)
  3. print(c,d)
  4. # 命名关键字必须在调用时,用关键字实参,要么调用时使用它的默认值,一旦写了一定指定关键字实参;
  5. func(5,6)

执行

  1. [root@node10 python]# python3 test.py
  2. 5 6
  3. 1 2

3.4 *和**的用法

  1. 在函数定义处: * ** 作用:打包 (比如普通收集参数和关键字收集参数)
  2. 在函数调用处: * ** 作用:解包
  3.  
  4. 好处: 可以控制参数的长度(优点) 动态产生不定长参数调用时需要用到
  5. * 可以对应str list tuple
  6. ** 可以对应dict

示例

  1. def func(a,b,c,*,d):
  2. print(a,b,c)
  3. print(d)
  4.  
  5. lst = [1,2,3]
  6. # *lst 在列表的前面加* 代表解包操作,把列表当中的元素,一个一个拿出来,当成参数给func调用 相当于func(1,2,3,d=90)
  7. func(*lst,d=90)

执行

  1. [root@node10 python]# python3 test.py
  2. 1 2 3
  3. 90

示例2

  1. def func(a,b,c,*,d,e,f):
  2. print(a,b,c)
  3. print(d,e,f)
  4. # *dictvar 在字典的前面加** 代表解包操作,把字典当中的元素,一个一个拿出来,当成d=1,e=12,f=13参数给func调用 ,相当于func(1,2,3,d=11,e=12,f=13) 一模一样
  5. dictvar = {"d":11,"e":12,"f":13}
  6. func(1,2,3,**dictvar)

执行

  1. [root@node10 python]# python3 test.py
  2. 1 2 3
  3. 11 12 13

具体用法示例

  1. #定义处: * 和 ** 是收集参数 ,负责打包 ,一颗星打包成元组,二颗星打包成字典
  2. def func(*args,**kwargs):
  3. pass
  4. # 调用处 * 和 ** 是魔术用法, 负责解包,一个星是将列表元素拆解成普通实参,二个星是将字典元组拆解成关键字实参
  5. func(*lst,**dictvar)

3.5 return返回值

  1. return + 数据类型 :    将这个数据弹到函数的调用处,后面除了可以接六大标准数据类型之外,还可以返回类 对象 函数 等;默认返回None
  2. 函数当中,执行完return 之后,函数立刻终止,意味着函数里 , 跟在return后面的代码不执行

把数据返回到函数的调用处

  1. def func():
  2. # return 1
  3. # return "aaabb"
  4. return [1,2,3,4]
  5.  
  6. # 这个地方是调用处 函数名()
  7. res = func() # 相当于 res = 1
  8. print(res)

函数的返回值不是必须的,按照需求来,如果不写return 返回值,默认返回None

  1. def func():
  2. print(1234566)
  3.  
  4. res = func()
  5. print(res)
  6.  
  7. # 打印1234567 和 自定义的return 之间没有半毛钱关系,返回值是自定义的;
  8. res = print(1234567)
  9. print(res)

执行

  1. [root@node10 python]# python3 test.py
  2. 1234566
  3. None
  4. 1234567
  5. None

(3) 写一个计算器

  1. def calc(sign,num1,num2):
  2. if sign == "+":
  3. res = num1 + num2
  4. elif sign == "-":
  5. res = num1 - num2
  6. elif sign == "*":
  7. res = num1 * num2
  8. elif sign == "/":
  9. if num2 == 0:
  10. return "我不认识"
  11. res = num1 / num2
  12. else:
  13. return "请正常一点"
  14. return res
  15. res = calc("+",5,1)
  16. print(res)

(1)在函数的定义处,跟在*号后面的参数是命名关键字参数def func(参数1,参数2,*,参数3,参数4):pass
(2)夹在普通收集参数和关键字收集参数之间的参数是命名关键字参数def func(*args,参数1,参数2,**kwargs):pass这两种是命名关键字参数;命名关键字参数在函数调用时,必须用关键字实参的形式调用(除非指定了默认值)

014.Python函数的更多相关文章

  1. python 函数之day3

    一 函数的语法及特性 什么是函数? 定义:函数是一个功能通过一组语句的集合,由名字(函数名)将其封装起来的代码块,要想执行这个函数,只要调用其函数名即可. 特性: 减少重复代码 使程序变的可扩展 使程 ...

  2. Python函数作用域的查找顺序

    函数作用域的LEGB顺序 1.什么是LEGB? L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间 G:global 全局作用域 B:build-in 内置作用域 2.它们 ...

  3. Python函数讲解

    Python函数

  4. Python函数信息

    Python函数func的信息可以通过func.func_*和func.func_code来获取 一.先看看它们的应用吧: 1.获取原函数名称: 1 >>> def yes():pa ...

  5. Python函数参数默认值的陷阱和原理深究"

    本文将介绍使用mutable对象作为Python函数参数默认值潜在的危害,以及其实现原理和设计目的 本博客已经迁移至: http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...

  6. Python开发【第四章】:Python函数剖析

    一.Python函数剖析 1.函数的调用顺序 #!/usr/bin/env python # -*- coding:utf-8 -*- #-Author-Lian #函数错误的调用方式 def fun ...

  7. Python函数解析

    对于Python的函数,我们需要记住的是: 1. 函数的默认返回值是None. 2. python是一个自上而下逐行解释并执行的语言.因此,函数的定义必须在函数被调用之前.同名的函数,后定义的会覆盖前 ...

  8. Python入门笔记(18):Python函数(1):基础部分

    一.什么是函数.方法.过程 推荐阅读:http://www.cnblogs.com/snandy/archive/2011/08/29/2153871.html 一般程序设计语言包含两种基本的抽象:过 ...

  9. Python函数1

    Python 函数命令的使用 想想我们之前数学中学到的函数,首先我们需要定义一个函数,例如f(x)=x, 当x输入任意数的时候,f(x)都能输出和x相等的数值. 那么在Python中是如何实现的呢? ...

随机推荐

  1. GoTTY-K8S-Docker 终端

    安装GoTTY 下载yum源 curl -s https://mirror.go-repo.io/centos/go-repo.repo | tee /etc/yum.repos.d/go-repo. ...

  2. Day05_23_封装

    封装 什么是封装? 封装可以被认为是一个类的保护屏障,防止该类的代码和数据被外部类定义的代码随机访问.要访问该类的代码和数据,必须通过严格的接口控制.封装最主要的功能在于我们能修改自己的实现代 码,而 ...

  3. 刨死你系列——手撕ArrayList

    不多BB,直接上代码: public class MyArrayList { //创建数组对象 private Object[] elements; //已使用数组长度 private int siz ...

  4. Springboot+Vue前后端分离的博客项目

    项目介绍 演示站(服务器已过期):http://blog.hanzhe.site 开源项目地址 ( 求给个Star ):https://gitee.com/zhang_hanzhe/blog 前端采用 ...

  5. BadUsb配合Cobalt-Strike免杀上线

    BadUsb配合Cobalt-Strike免杀上线 前言: 原理简介:Badusb的原理是将恶意代码预置在固件之中,当受害人插入USB时,就会执行恶意代码进行恶意操作.Badusb将恶意代码预存在U盘 ...

  6. 794. Valid Tic-Tac-Toe State

    A Tic-Tac-Toe board is given as a string array board. Return True if and only if it is possible to r ...

  7. 1.4.18- HTML之特殊字符标签

    上面图片内容简单了解一下,下面我们看一段代码: <!DOCTYPE html> <html lang="en"> <head> <meta ...

  8. 缓冲区溢出分析第08课:MS06-040漏洞研究——动态调试

    前言 经过上次的分析,我们已经知道了MS06-040漏洞的本质,那么这次我们就通过编程实现漏洞的利用. 编写漏洞利用程序的框架 这里我使用的是VC++6.0进行编写,需要将包含有漏洞的netapi32 ...

  9. Linux中的shell和bash

    目录 shell shell script sh bash Dash tty .pty 和 pts 学安全的我们,经常会听到说获得某服务器的shell,就是指获得某个服务器的操作权限.我们学习linu ...

  10. PowerShell-4.API调用以及DLL调用

    PowerShell可以直接调用API,So...这东西完全和cmd不是一回事了... 调用API的时候几乎和C#一样(注意堆栈平衡): 调用MessageBox: $iii = Add-Type - ...