什么是函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。

学习完函数,继续学习面象对像,点击类


你可以定义一个由自己想要功能的函数,以下是简单的规则:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()
  • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None

函数基本使用

python中定义函数所用的关键字是def, def 函数名() : 冒号代替其他编程语言的大括号,然后换行缩进写的代码就是函数体。

def example():
'''
一个简单的函数
'''
print("Hello World !") example()

打印结果:Hello World !

三引号中间的内容属于函数的注释文档,注释的作用是告诉别人或以后查看代码知道能快速知道这段干嘛是做什么的。

函数还可以嵌套,也就是函数里面有函数

def exapmle(name):
def go(name):
print('我最棒:' + name)
go(name) example('小明')

打印结果:我最棒:小明

函数的参数

形参和实参

def example(username):
print("Hello World ! My name is " + str(username)) example("小明")
example("小花")

打印结果:

Hello World ! My name is 小明
Hello World ! My name is 小花

这是一个带参数的函数,在函数example中,username就是一个形参,也就是形式参数,是用来接收调用函数时传入的参数,你传的是啥它就是啥,传人它就是人,传鬼它就是鬼的那种。

实参就是实际参数,在调用函数的时候,传递是小明,那么小明就是实参,传递的是小花,那么小花也是实参,实参传递给函数后,会赋值给函数中的形参,然后我们就可以在函数中使用到外部传入的数据了。

参数默认值

写Java的时候最痛恨的就是方法不能设置默认值,使得必须得重载才行。

python允许我们给函数的形参设置一个默认值,不传参数调用的话,就统一默认是这个值。

def welcome(username = '奥特曼'):
print("Hello World ! My name is " + str(username)) welcome("小明")
welcome()

打印结果:

Hello World ! My name is 小明
Hello World ! My name is 奥特曼

修改参数后影响外部

在函数中修改参数内容会不会影响到外部,这个问题取决于实参的类型是不是可变的,可不可变就是可不可以修改。

字符串就是一种不可变的类型。

比如:

name = "小明"
name = "小花"

请问,我是把"小明"修改成了"小花"吗? 答案是 非也。

实际上我是把"小花"这个字符串赋值给了name,让name指向了这个新字符串,替换掉了原来的"小明",原来的"小明"仍然是"小明",没有受到一点改变。

在python中,不可变类型有:整数、字符串、元组,可变类型有:列表、字典。如果传递的参数包含可变类型,并且在函数中对参数进行了修改,那么就会影响到外部的值

def change(lis):
lis[1] = '小明他二舅' names = ['小明','小花','小红']
change(names)
print(names)

打印结果:['小明', '小明他二舅', '小红']

如果我们不希望出现这种事情,那么就将对象复制一份再传递给函数。

def change(lis):
lis[1] = '小明他大爷' names = ['小明','小花','小红']
change(names[:])
print(names)

打印结果:['小明', '小花', '小红']

我们用切片的方法拷贝了一份names,函数中尽管修改了参数,也不过是修改的是副本,不会影响到原始的names。

关键字参数

关键字参数让你可以不用考虑函数的参数位置,你需以键值对的形式指定参数的对应形参。

def welcome(name,address):
print(f"你好 {name} , 欢迎来到 {address} !") welcome(address='长沙',name='小强')

打印结果:你好 小强 , 欢迎来到 长沙 !

收集参数

有时候我们需要允许用户提供任意数量的参数,函数的形参可以带个星号来接收,不管调用函数的时候传递了多少实参,都将被收集到形参这个变量当中,形参的类型是元组。

def welcome(*names):
print(names) welcome('乐迪','天天','酷飞','小黑')

打印结果:('乐迪', '天天', '酷飞', '小黑')

还有一种是带两个星号的形参,用于接收键值对形式的实参,导入到函数中的类型是字典。

def welcome(**names):
print(names) welcome(name='小明',age=20,sex='男')

打印结果:{'name': '小明', 'age': 20, 'sex': '男'}

分配参数

分配参数是收集参数的相反操作,可使得一个元组或字典变量自动分配给函数中的形参。

def welcome(name,address):
print(f"你好 {name} , 欢迎来到 {address} !") a = ('小明','广州')
welcome(*a)

打印结果:你好 小明 , 欢迎来到 广州 !

我们改成字典的方式:

def welcome(name,address):
print(f"你好 {name} , 欢迎来到 {address} !") a = {'address':'山东','name':'小红'}
welcome(**a)

打印结果:你好 小红 , 欢迎来到 山东 !

函数的返回值

首先说明,所有的函数都是有返回值的,如果编程人员没有指定返回值,那么默认会返回None,对标其他语言中的null

一个简单的函数返回值的例子:

def get_full_name(first_name,last_name):
return first_name + last_name r = get_full_name('王','大拿')
print(r)

打印结果:王大拿

然而python中的函数还可以返回多个值,返回出的值被装载到元组中:

def func(num):
return num**2,num**3,num**4 result = func(2)
print(result)

打印结果:(4, 8, 16)

  在python中函数定义的时候没有返回值的签名,导致我们无法提前知道函数的返回值是什么类型,返回的什么完全看函数中的return的是什么,特别是逻辑代码比较多的函数,比如里面有多个if判断,有可能这个判断return出来的是布尔值,另一个判断return出来的是列表,还一个判断啥也不return,你调用的时候你都搞不清楚该怎么处理这个函数的返回值,在这一点来说,Java完胜。

所以在无规则限制的情况下,代码写的健不健壮,好不好用,主要取决于编程人员的素质。

匿名函数

  匿名函数就是不用走正常函数定义的流程,可以直接定义一个简单的函数并把函数本身赋值给一个变量,使得这个变量可以像函数一样被调用,在python中可以用lambda关键字来申明定义一个匿名函数。

我们把王大锤的例子改一下:

get_full_name = lambda first_name,last_name : first_name + last_name
r = get_full_name('王','大锤')
print(r)

打印结果:王大锤

函数的作用域

访问全局作用域

  python每调用一个函数,都会创建一个新命名空间,也就是局部命名空间,函数中的变量就叫做局部变量,与外部的全局命名空间不会相互干扰。

这是常规状态,当然也会有非常规需求的时候,所以python给我们提供了globals()函数,让我们可以在局部作用域中访问到全局的变量。

 
def func():
a = globals()
print(a['name']) name = '小明'
func()
 

打印结果:小明

  globals()函数只能让我们访问到全局变量,但是是无法进行修改的,如果我们要修改全局变量,需要用到global关键字将全局变量引入进来。

def func():
global name
name = '小花' name = '小明'
func()
print(name)

打印结果:小花


  如果文章对你有帮助,麻烦伸出发财小手点个赞,感谢您的支持,你的点赞是我持续更新的动力。
  如果对软件测试、接口测试、自动化测试、技术同行、持续集成、面试经验交流。感兴趣可以进到893694563,群内会有不定期的发放免费的资料链接。

Python3入门系列之-----函数的更多相关文章

  1. Python3入门系列之-----range和xrange的区别详解,你明白了吗?

    前言 range()是Python的内置函数,用于创建整数的列表,可以生成递增或者递减的数列. xrange也有相同的功能, 今天来看下它们之间的不同. range 函数说明:range([start ...

  2. Python3入门系列之-----算术运算符|比较运算符|赋值运算符|逻辑运算符|成员运算符|身份运算符

    什么是运算符? 本章节主要说明Python的运算符.举个简单的例子 1 +2 = 3 . 例子中,1 和 1.2 被称为操作数,"+" 称为运算符. Python语言支持以下类型的 ...

  3. Python3入门系列之-----return返回值,我终于懂了

    前言 初学者学习return的用法有点蒙,不知道它的作用是什么?返回的是什么?在什么时候要用?小伙伴也可能会遇到和我同样的困扰,给大家举个例子,马上就明白了. 同一段代码,函数中带return和没有r ...

  4. Python3入门系列之-----看完这一篇文章我终于学会了类

    前言 类顾名思义,就是一类事物.或者叫做实例,它用来描述具有共同特征的一类事物.我们在Python中声明类的关键词是class,类还有功能和属性,属性就是这类事物的特征,而功能就是它能做什么,也是就是 ...

  5. Python3入门系列之-----json与字典转换

    json JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写 JSON 函数 使用 JSON 函数需要导入 json 库:import js ...

  6. Python3入门系列之-----file方法操作

    file方法 file处理文件的一些方法,创建一个file对像后即可对文件进行读写相关操作,首先你得打开文件,此处用到open函数 open函数 语法:file_objcet = open(file_ ...

  7. Python3入门系列之-----环境搭建

    前  言 最近一直在学习Python,想用笔记的方式记录自己踩过的那些坑.俗话说:好记性不如烂笔头. 分享给想学Python的小伙伴.目前本人在学习Python+selenium.接口自动化,有兴趣的 ...

  8. Python3入门系列之-----内置的文件操作模块OS

    前言 在自动化测试中,经常需要查找操作文件,比如说查找配置文件(从而读取配置文件的信息),查找测试报告(从而发送测试报告邮件),经常要对大量文件和大量路径进行操作,这个时候就需要用到os模块. 使用前 ...

  9. Python3入门系列之-----异常处理

    前言 作为 Python 初学者,在刚学习 Python 编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍. Python 有两种错误很容易辨认:语法错误和异常. Python ...

随机推荐

  1. 《redis 5设计与源码分析》:第二章 简单动态字符串

    介绍 简单动态字符串(Simple Dynamic Strings, SDS)是Redis的基本数据结构之一,用于存储字符串和整型数据.它的特点是:方便扩容.二进制安全. 二进制安全 在C语言中,用& ...

  2. kubebuilder实战之五:operator编码

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  3. CSS截取字段,让过长的字段结尾变成省略号(IE有效)

    text-overflow:ellipsis;overflow:hidden;<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transiti ...

  4. <题解>「LibreOJ NOIP Round #1」序列划分

    solutions 题面loj#542 对我来说,这或许已经超出了我的能力,我,只能看题解 不知道我写完这一篇题解之后,会不会对我的构造题有一点点的帮助 让我在这类题的解决上能过有一些提升 直接说明白 ...

  5. 办公室文员必备python神器,将PDF文件表格转换成excel表格!

    [阅读全文] 第三方库说明 # PDF读取第三方库 import pdfplumber # DataFrame 数据结果处理 import pandas as pd 初始化DataFrame数据对象 ...

  6. 基于Bootstrap v4.1.1 & Bootstrap-table-1.14.1实现数据瀑布流

    基于Bootstrap-table-1.14.1实现数据瀑布流 HTML代码 <div id="AvgWaitAndAvgTimeServiceTimeData_hall"& ...

  7. openwrt开发笔记一:源码下载与编译

    1.1 环境要求 编译系统:Linux发行版(本文使用Ubuntu) 编译一个可以安装的OpenWrt固件镜像文件(大约8MB大小的),你需要: 一个纯净的OpenWrt编译系统大约需要200MB的空 ...

  8. Appium自动化(16) - 使用手机浏览器进行自动化测试

    如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 前面我都讲的都是针对 app ...

  9. Hamcrest 断言框架

    Hamcrest是一个为了测试为目的,能组合成灵活表达式的匹配器类库.用于编断言的框架,使用这个框架编写断言,提高可读性及开发测试的效率,提供了大量"匹配器"方法,每个匹配器用于执 ...

  10. VMware安装IPFire防火墙镜像

    之后便可以通过WEB登录到管理页面(admin账号,密码是在上面配置的) 详细可参考:https://www.mobibrw.com/2016/4900