一 初识函数

大家都有没有玩过陌陌,探探这种软件?这种软件是专门为你们没有对象的男士设置的,这是一款合理合法的约炮,哦不对,交友软件,那么现在我们用Python代码简单模拟一下:

print("拿出手机")

print("打开陌陌")

print('左滑一下')

print('右滑一下')

print("找个漂亮的妹子")

print("问她,约不约啊!")

print("ok 走起")

ok so easy我们已经完成了我们模拟探探的需求,其实我们做的这个就是一个功能,什么功能呢?就是交友的功能,那么问题来了, 我还想在约一次整么搞,是不是就是在写一遍

# 约一次

pint("拿出手机")

print("打开陌陌")

print('左滑一下')

print('右滑一下')

print("找个漂亮的妹子")

print("问她,约不约啊!")

print("ok 走起")

# 再约一次

pint("拿出手机")

print("打开陌陌")

print('左滑一下')

print('右滑一下')

print("找个漂亮的妹子")

print("问她,约不约啊!")

print("ok 走起")

那么这样写好么? 当然不好了,为什么呢? 重复代码太多了。 所以我们能否将这些代码放到一个地方,想用这些代码了,我就通过一个指令,调用过来,不想用就不写这个指令就行了,这样就能极大限度的减少代码的重复率,那么咱们看下面:

def date():
print("拿出手机")
print("打开陌陌")
print('左滑一下')
print('右滑一下')
print("找个漂亮的妹子")
print("问她,约不约啊!")
print("ok 走起")

那么这里,我写了一个约会的功能,我将上面的那些重复代码封装到这个所谓的函数中,这样,我什么时候需要使用这个功能,我通过一个指令调用即可。

def date():
print("拿出手机")
print("打开陌陌")
print('左滑一下')
print('右滑一下')
print("找个漂亮的妹子")
print("问她,约不约啊!")
print("ok 走起") date() # 调用函数

上面这个就是一个函数,那么接下来我们就来研究一下这个函数。

从上面的对比我们看一下函数的优势:

1,减少代码的重复性。

2,使代码可读性更好。

二. 函数的结构与调用

2.1函数的结构

首先咱们先看一下函数的结构:

def 函数名():

    函数体

def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":"。

def 是固定的,不能变,他就是定义函数的关键字。

空格 为了将def关键字和函数名分开,必须空(四声),当然你可以空2格、3格或者你想空多少都行,但正常人还是空1格。

函数名:函数名只能包含字符串、下划线和数字且不能以数字开头。虽然函数名可以随便起,但我们给函数起名字还是要尽量简短,并且要具有可描述性

括号:是必须加的,先别问为啥要有括号,总之加上括号就对了(下面就会讲到)!

下面的函数体一定全部都要缩进,这代表是这个函数的代码。

我们现在就来实现刚刚我们说的定义一个约会功能:

def date():
print("拿出手机")
print("打开陌陌")
print('左滑一下')
print('右滑一下')
print("找个漂亮的妹子")
print("问她,约不约啊!")
print("ok 走起")

哦了,这就定义完了,但是这个时候我们去执行,会发生什么现象? 什么都没有发生.因为我只定义了一个函数.但是还没有执行过这个函数.

2.2函数的调用

使用函数名加小括号就可以调用了 写法:函数名() 这个时候函数的函数体会被执行

通过上面的动态图大家可知,只有解释器读到函数名() 时,才会执行此函数,如果没有这条指令,函数里面即使有10万行代码也是不执行的。

而且是这个指令你写几次,函数里面的代码就运行几次,就好比你在部队,我喊你名字,喊几次,你就得 到 几次,这就是指令。

直接调用定义好的函数就可以了 咱们约完之后的得有个结果吧, 比如是约的萝莉,还是大妈啊总得有个结果,那么这个结果

怎么来描述和获得呢? 这就涉及到函数的返回值啦

三. 函数的返回值

一个函数就是封装一个功能,这个功能一般都会有一个最终结果的,比如你写一个登录函数,最终登录成功与否是不是需要返回你一个结果?还有咱们是不是都用过len这个函数,他是获取一个对象的元素的总个数,最终肯定会返回一个元素个数这样的结果:

s1 = 'abfdas'
print(len(s1)) # 6
那么这个返回值如何设置呢?这就得用到python中的一个关键字:return def date():
print("拿出手机")
print("打开陌陌")
print('左滑一下')
print('右滑一下')
print("找个漂亮的妹子")
return
print("问她,约不约啊!")
print("ok 走起")
  1. 函数中遇到return,此函数结束.不在继续执行

那么函数的返回值,既然叫做返回值,他就是返回一些数据,那么返回给谁呢?

跟我们之前使用的len一样,函数的返回值返回给了 函数名() 这个整体,也就是这个执行者。

  1. return 会给函数的执行者返回值。

当然,也可以返回多个值。

如果返回多个值,是以元组的形式返回的。

总结一下:

  1.遇到return,函数结束,return下面的(函数内)的代码不会执行。

  2.return 会给函数的执行者返回值。

      如果return后面什么都不写,或者函数中没有return,则返回的结果是None

      如果return后面写了一个值,返回给调用者这个值

      如果return后面写了多个结果,,返回给调用者一个tuple(元组),调用者可以直接使用元组的解构获取多个变量。

def date():
print("拿出手机")
print("打开陌陌")
print('左滑一下')
print('右滑一下')
print("找个漂亮的妹子")
print("问她,约不约啊!")
print("ok 走起")
return '漂亮的妹子','小萝莉', '成熟女性'
g1,g2,g3 = date()
print(g1, g2, g3) # 漂亮的妹子 小萝莉 成熟女性

四. 函数的参数

我们上面研究了,函数的结构,函数的执行,以及函数的返回值。对函数有一个初步的了解,那么接下来就是一个非常重要的知识点,函数的参数。函数是以功能为导向的,上面我们写的函数里面的代码都是写死的,也就是说,这个函数里面的更改起来很麻烦,试想一下,我们使用探探,陌陌等软件,可不可以进行筛选,比如选择性别,年龄等,导出结果? 再拿我们之前学过的len 这个len是不是可以获取字符串的总个数?是不是可以获取列表的总个数?你更改了len函数内部的代码了?没有吧?你看下面的例子:

s1 = 'sfdas'
l1 = [1, 3, 7]
print(len(s1)) # 5
print(len(l1)) # 3

那么我们写的函数也是可以将一些数据传到函数里面的,然后让里面的代码利用上这个数据产生我们想要的结果,在返回。

举个例子:

def date(sex):
print("拿出手机")
print("打开陌陌")
print('设置筛选条件:性别: %s' %sex)
print("找个漂亮的妹子")
print("问她,约不约啊!")
print("ok 走起") date('女')

上面就是函数传参的示例,函数的参数可以从两个角度划分:

  1.形参

    写在函数声明的位置的变量叫形参,形式上的一个完整.表示这个函数需要xxx

  2.实参

    在函数调用的时候给函数传递的值.加实参,实际执行的时候给函数传递的信息.表示给函数xxx

 函数的传参就是函数将实际参数交给形式参数的过程.

def date(sex):  # 函数定义时(参数) 这个就是形参
print("拿出手机")
print("打开陌陌")
print('设置筛选条件:性别: %s' %sex)
print("找个漂亮的妹子")
print("问她,约不约啊!")
print("ok 走起") date('女') # 函数执行时(参数) 这个就是实参
# 这个过程就是:代码运行到date('女')开始执行此函数同时将字符串'女'这个数据传递给变量sex,然后执行函数中的代 # 码。如果遇到sex,其实就是使用'女'这个数据。

我们先从实参角度学习函数的参数。

实参角度

1, 位置参数

位置参数就是从左至右,实参与形参一一对应。

def date(sex, age, hobby):
print("拿出手机")
print("打开陌陌")
print('设置筛选条件:性别: %s,年龄:%s,爱好:%s' %(sex, age, hobby))
print("找个漂亮的妹子")
print("问她,约不约啊!")
print("ok 走起")
date('女','25~30','唱歌')
date('人妖','20~25','萝莉音')

练习

编写函数,给函数传递两个参数a,b a,b相加 返回a参数和b参数相加的和

def f(a,b):
c = a+b
return c num_sum = f(5,8)
print(num_sum)
结果: 13

编写函数,给函数传递两个参数a,b 比较a,b的大小 返回a,b中最大的那个数

def f(a,b):

    if a>b:

        return a

    else:

        return b

num_sum = f(5,8)

print(num_sum)
结果:8

比较大小的这个写法有点麻烦,我们在这里学一个三元运算符

def f(a,b):

    c = a if a > b else b  #当a>b就把a赋值给c,否则就把b赋值给c

    return c

msg = f(5,7)

print(msg)

结果:

7

2, 关键字参数 

位置参数好不好呢? 如果是少量的参数还算OK, 没有问题. 但是如果函数在定义的时候参数非常多怎么办? 程序员必须记住, 我有哪些参数, 而且还有记住每个参数的位置, 否则函数就不能正常调用了. 那则么办呢? python提出了一种叫做关键字参数. 我们不需要记住每个参数的位置. 只要记住每个参数的名字就可以了

def date(sex, age, hobby):
print("拿出手机")
print("打开陌陌")
print('设置筛选条件:性别: %s,年龄:%s,爱好:%s' %(sex, age, hobby))
print("找个漂亮的妹子")
print("问她,约不约啊!")
print("ok 走起")
date(hobby='唱歌',sex='女',age='25~30',)

搞定, 这样就不需要记住繁琐的参数位置了.

3, 混合参数

可以把上面两种参数混合着使用. 也就是说在调用函数的时候即可以给出位置参数, 也可以指定关键字参数.

混合参数一定要记住:关键字参数一定在位置参数后面。
def date(sex, age, hobby):
print("拿出手机")
print("打开陌陌")
print('设置筛选条件:性别: %s,年龄:%s,爱好:%s' %(sex, age, hobby))
print("找个漂亮的妹子")
print("问她,约不约啊!")
print("ok 走起")
date('女',hobby='唱歌',age='25~30',)

综上: 在实参的⾓角度来看参数分为三种:

1. 位置参数
2. 关键字参数
3. 混合参数, 位置参数必须在关键字参数前面

接下来我们从形参角度分析,函数的参数

形参角度

1, 位置参数

  位置参数其实与实参角度的位置参数是一样的,就是按照位置从左至右,一一对应

def date(sex, age, hobby):
print("拿出手机")
print("打开陌陌")
print('设置筛选条件:性别: %s,年龄:%s,爱好:%s' %(sex, age, hobby))
print("找个漂亮的妹子")
print("问她,约不约啊!")
print("ok 走起")
date('女','25~30','唱歌')

2, 默认值参数

  在函数声明的时候, 就可以给出函数参数的默认值. 默认值参数一般是这个参数使用率较高,才会设置默认值参数,可以看看open函数的源码,mode=‘r’就是默认值参数. 比如, 我们录入咱们班学生的基本信息. 通过调查发现. 我们班大部分学生都是男生. 这个时 候就可以给出⼀一个sex='男'的默认值.

def stu_info(name, age, sex='男'):   

    print("录入学生信息")

    print(name, age, sex)   

    print("录入完毕")

stu_info("张强", 18)

注意:必须先声明在位置参数,才能声明关键字参数

综上:在形参的角度来看

  1. 位置参数
  2. 默认认值参数(大多数传进来的参数都是一样的, 一般用默认参数

函数的形参角度参数还有两种,亲看下一篇博客

学习4:内容# 1.列表 # 2.元祖 # 3.range的更多相关文章

  1. 学习4:总结# 1.列表 # 2.元祖 # 3.range

    列表 -- list 有序,可变的,索引, 作用:存储数据的,支持很多种数据类型 定义方式: lst = [1,"alex","黑哥"] 增: append 追 ...

  2. python学习笔记(一)、列表和元祖

    该一系列python学习笔记都是根据<Python基础教程(第3版)>内容所记录整理的 1.通用的序列操作 有几种操作适用于所有序列,包括索引.切片.相加.相乘和成员资格检查.另外,Pyt ...

  3. Python学习笔记-数字,列表,元祖,切片,循环

    数字 1,加减乘除:+,-,*,/ 2,平方:** 3,立方:**3 4,字符串转换:str(数字) 5,浮点数:带小数点  0.2 Python编程建议 import this >>&g ...

  4. 《Python》 列表、元祖和range

    一.列表: 1.Python基础数据类型之一: 2.其他语言中也有列表的概念,js 数组: 3.可索引,可切片,可加步长: 4.列表可以存储大量的数据: 第一:索引,切片,切片+步长. 第二:增删改查 ...

  5. 列表,元祖,range

    列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型,比如js中叫数组,他是以[]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型比如: li = ['alex',12 ...

  6. 从入门到自闭之Python列表,元祖及range

    1.列表 数据类型之一,存储数据,大量的,存储不同类型的数据 列表是一种有序的容器 支持索引 列表是一种可变数据类型 原地修改 列表中只要用逗号隔开的就是一个元素,字符串中只要是占一个位置的就是一个元 ...

  7. Day 04 列表,元祖,range

    列表: why: 1.字符串取值费劲 2.对字符串做任何操作,取出来的都是字符串 3.字符串有长度限制 基于以上原因,python提供了另一个数据类型,list 容器类数据类型. 列表页脚数组,可以存 ...

  8. Python基础-列表、元祖、字典、字符串

    列表和分组 序列概览: 数据结构是通过某种方式组织在一起的数据元素的集合.这些元素可以是数字.字符,甚至可以是其他数据结构. 在python中,最基本的数据结构是序列(sequence). 序列中的每 ...

  9. python基础--列表、元祖、字典、集合

    列表(List) 1.列表特点 列表是可变的!! list 是一种有序的序列,可以添加.删除其中的元素,并且可以通过下标(索引)访问 数据 2.简单的常用操作 A.通过下表访问元素 print(lis ...

随机推荐

  1. 使用NAudio实现Wav转Mp3

    转换成MP3: using Microsoft.Win32; using NAudio.MediaFoundation; using NAudio.Wave; using System.Windows ...

  2. C++ GUID和string转化函数【转载】

    原文地址:https://blog.csdn.net/zgl7903/article/details/5488294 因为这两个函数太好用,解决了大问题,我必须转载一下了.转自csdn牛人 zgl79 ...

  3. Advanced Installer 打包后,安装包在WIN10下重启后再次运行安装的解决办法

    原文:Advanced Installer 打包后,安装包在WIN10下重启后再次运行安装的解决办法 前几个月使用Advanced Installer 打包了一堆安装包,其中有使用默认主题的,也有根据 ...

  4. iBatisNet 中 iterate标签的使用

    <iterate>标签,顾名思义是用来遍历标签用的. 支持的属性如下: 属性 说明 是否必选 open 遍历后生成的这些sql,开始的第一个符号 可选 close 遍历后生成的这些sql, ...

  5. 安装 VirtualBox 出现回滚,无法安装及解决方法

    原文:安装 VirtualBox 出现回滚,无法安装及解决方法 缘由:打算安装 Vagrant,因此打算安装 VirtualBox. 现象:安装 VirtualBox,进度快到最后的时候,安装程序执行 ...

  6. xgboost参数及调参

    常规参数General Parameters booster[default=gbtree]:选择基分类器,可以是:gbtree,gblinear或者dart.gbtree和draf基于树模型,而gb ...

  7. C函数实现返回多个值的方法

    C语言中,一个函数最多只能实现一个返回值. int func (int b) { int a=5; if (a>b) return a; else return b; return  0; } ...

  8. 发布Qt Quick桌面应用程序的方法(使得planets在XP上运行)

    发布Qt Quick桌面应用程序的方法 Qt是一款优秀的跨平台开发框架,它可以在桌面.移动平台以及嵌入式平台上运行.目前Qt 5介绍程序发布的文章帖子比较少.大家又非常想要知道如何发布Qt应用程序,于 ...

  9. How Qt Signals and Slots Work(感觉是通过Meta根据名字来调用)

    Qt is well known for its signals and slots mechanism. But how does it work? In this blog post, we wi ...

  10. QT在linux环境下读取和设置系统时间(通过system来直接调用Linux命令,注意权限问题)

    QT在Linux环境下读取和设置系统时间 本文博客链接:http://blog.csdn.NET/jdh99,作者:jdh,转载请注明. 环境: 主机:Fedora12 开发软件:QT 读取系统时间 ...