08-Python之路---初识函数
Python之路---初识函数️
程序员三大美德:
- 懒惰
因为一直致力于减少工作的总工作量。
- 缺乏耐性
因为一旦让你去做本该计算机完成的事,你将会怒不可遏。
- 傲慢
因为被荣誉感冲晕头的你会把程序写得让谁都挑不出毛病来。
大家好, 现在让我们一起来学习一下函数
Why-为什么要使用函数?
现在我们需要计算一个字符串的长度,我们可以直接使用len()方法:
num = len('hello')
但是如果我们不用len方法,怎么实现这个需求?其实也不难:
s = 'hello'
length = 0
for i in s:
length += 1
print(length)
好了,功能实现了,然后又有一个需求(产品经理日常加需求),要计算另一个字符串的长度---“world”。
于是,本着程序员三大美德,我们使用最强大的快捷键---Ctrl+c , Ctrl+v:
s1 = 'world'
length = 0
for i in s1:
length += 1
print(length)
这样确实可以实现需求,但是总感觉不是那么完美,为什么呢?
首先,之前我只需要执行len方法就可以拿到一个字符串的长度,而现在为了实现相同功能,我们需要把相同的代码写很多遍 --- 代码冗余
其次,刚刚的代码不是那么容易读懂 ---- 可读性差
我们就想,要是我们能像使用len一样使用我们这一大段“计算长度”的代码就好了。这种感觉有点像给这段代码起了一个名字,等我们用到的时候直接喊名字就能执行这段代码就行。
函数定义与调用
现在教大家一个技能,把代码装起来:
def mylen():
"""计算字符串长度"""
s = 'hello'
length = 0
for i in s:
length += 1
print(length)
来分析下这段代码:
其实除了def这一行和后面的缩进,其它的和前面的代码是一样的。
现在执行以下,你会发现啥也没发生!
因为这里我们只是把代码装起来了,还不会往外拿,拿应该怎么拿出来呢?
mylen()
这就是代码取出来的过程。
# 定义函数
def mylen():
"""计算字符串长度"""
s = 'hello'
length = 0
for i in s:
length += 1
print(length)
# 调用函数
mylen()
总结:
定义:
def关键字开头,空格后接函数名称和圆括号(),最后还有一个“:”
函数名只能包含字符串、下划线和数字且不能以数字开头。虽然函数名可以随便起,但我们给函数起名字还是要尽量简短,并能表达函数功能
括号:是必须加的,先别问为啥要有括号,总之加上括号就对了!
注释:每一个函数都应该对功能和参数进行相应的说明,应该写在函数下面第一行。以增强代码的可读性。
调用: 就是 函数名() 要记得加上括号
函数返回值
前面我们写了一个函数,这个函数可以帮助我们计算字符串的长度,并且把结果打印出来。但是,这和我们的len方法还不是太一样。以前我们调用len方法会得到一个值,我们可以用一个变量来接收这个值。
str_len = len('hello')
那么我们写的函数能做到吗?
# 定义函数
def mylen():
"""计算字符串长度"""
s = 'hello'
length = 0
for i in s:
length += 1
print(length)
# 调用函数
str_len = mylen()
print('str_len : %s'%str_len)
执行代码,获得的输出结果是str_len值为None,这说明什么也没返回
那么应该怎么让他有返回值呢?
return
# 定义函数
def mylen():
"""计算字符串长度"""
s = 'hello'
length = 0
for i in s:
length += 1
return length
# 调用函数
str_len = mylen()
print('str_len : %s'%str_len)
只需要在函数最后加上一个return的关键字,return后面写上你要返回的值就可以了
return关键字的作用
return 是一个关键字,在pycharm里,你会看到它变成蓝色了。
这个词翻译过来就是“返回”,所以我们管写在return后面的值叫“返回值”
没有返回值:
- 不写return的情况下,会默认返回一个None
- 只写return,后面不写其他内容,也会返回None,那么为啥要写呢?return的其他用法,就是一旦遇到return,结束整个函数。
- return None:和上面的两种情况一样,我们一般不这样写。
返回一个值:
注意:*return和返回值之间要有空格,可以返回任意数据类型的值
返回多个值:
可以返回任意多个、任意数据类型的值
def demo1():
'''返回多个值'''
return 1,2,3,4 def demo2():
'''返回多个任意类型的值'''
return 1,['a','b'],3,4 ret1 = demo1()
print(ret1)
ret2 = demo2()
print(ret2)返回的多个值会被组织成元组被返回,也可以用多个值来接收
def demo3():
return 1,['a','b'],3,4 #返回多个值,用一个变量接收
ret3 = demo3()
print(ret2) #返回多个值,用多个变量接收
a,b,c,d = demo3()
print(a,b,c,d) #用多个值接收返回值:返回几个值,就用几个变量接收
a,b,c,d = demo3()
print(a,b,c,d)
函数的参数
这个函数还是不完美,因为之前我们使用len函数的时候,是可以想计算谁就计算谁的长度,但是我们写的这个函数只能计算“hello”的长度,换一个字符串就需要更改函数内部的变量,这样可不行,那应该怎么办?
带参数的函数:
#函数定义
def mylen(s):
"""计算s1的长度"""
length = 0
for i in s:
length = length + 1
return length
#函数调用
str_len = mylen("hello")
print('str_len : %s'%str_len)
我们告诉mylen函数要计算的字符串是谁,这个过程叫做传递参数,简称传参,调用函数
时传递的这个“hello”和定义函数的s就是参数。
实参和形参
我们调用函数时传递的这个“hello”被称为实际参数,因为这个是实际的要交给函数的内容,简称实参。
定义函数时的s,只是一个变量的名字,被称为形式参数,因为在定义函数的时候它只是一个形式,表示这里有一个参数,简称形参。
传递多个参数
参数可以传递多个,多个参数之间用逗号分割。
def mymax(x,y):
"""比较两个数的大小"""
the_max = x if x > y else y
return the_max
the_max = mymax(9,99)
print(the_max)
正是因为需要传递多个参数,所以才有了下面的参数类型
1.位置参数
按照位置传值:
def mymax(x,y):
"""比较两个数的大小"""
the_max = x if x > y else y
return the_max
the_max = mymax(9,99)
print(the_max)
2.关键字参数
按照关键字传值:
def mymax(x,y):
"""比较两个数的大小"""
the_max = x if x > y else y
return the_max
the_max = mymax(y=99, x=9)
print(the_max)
PS:位置、关键字形式混着用
def mymax(x,y):
"""比较两个数的大小"""
the_max = x if x > y else y
return the_max
the_max = mymax(9, y=99)
print(the_max)
正确用法:
- 位置参数必须在关键字参数的前面
2. 对于一个形参只能赋值一次
3. 默认参数
why?将变化比较小的值设置成默认参数
def info(name, sex='男'):
"""打印学生信息"""
print(name, sex)
info('马克')
info('王富贵', '女')
参数陷阱:默认参数是一个可变数据类型
def func(a, l=[]):
l.append(a)
print(l)
func(1)
func(2)
func(3)
4. 动态参数(不定长参数)
*args:按位置传值多余的参数都由args统一接收,保存成一个元组的形式
def mysum(*args):
"""求和"""
the_sum = 0
print(args) # 保存成元组形式
print(type(args)) for i in args:
the_sum += i
return the_sum sum = mysum(10, 20, 30)
print(sum)**kwargs:按位置传值多余的参数都由kwargs统一接收,保存成一个字典的形式
def stu_info(**kwargs):
print(kwargs) # 保存成字典
print(kwargs['name']) stu_info(name='不喜欢马赛克的马克', sex='男')
总结
函数:
参数:
08-Python之路---初识函数的更多相关文章
- python之路——初识函数
阅读目录 为什么要用函数 函数的定义与调用 函数的返回值 函数的参数 本章小结 返回顶部 为什么要用函数 现在python届发生了一个大事件,len方法突然不能直接用了... 然后现在有一个需求,让你 ...
- python之路--初识函数
一 . 函数 什么是函数 f(x) = x + 1 y = x + 1 # 函数是对功能或者动作的封装 函数的语法 def 函数名(): 函数体 调用: 函数名() def play(): print ...
- python基础之 初识函数&函数进阶
函数基础部分 1.什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率. 2.定义函数 定义:def 关键词开头,空格之后接函数名 ...
- Python之路【第五篇】python基础 之初识函数(一)和文件管理
转载请注明出处http://www.cnblogs.com/wupeiqi/articles/5453708.html 函数 一.背景 ...
- python爬虫之路——初识函数与控制语句
介绍python函数的定义与使用方法,介绍Python的常用控制语句:判断和循环 函数: 格式 def 函数名(参数1,参数2): return ‘结果’ 判断语句:就是多选一 二选一: if c ...
- Python之路 day3 函数定义 *args及**kwargs
#!/usr/bin/env python # -*- coding:utf-8 -*- #Author:ersa import time # def logger(): # time_format ...
- 小白的Python之路 day3 函数
1.函数基本语法及特性 背景提要 现在老板让你写一个监控程序,监控服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码 1 2 ...
- python之路(九)-函数装饰器
装饰器 某公司的基础业务平台如下: def f1(): print('这是f1业务平台') def f2(): print('这是f2业务平台') def f3(): print('这是f3业务平台' ...
- python之路--初识面向对象
一 . 初识面向对象 面向过程: 一切以事务的发展流程为中心. 面向对象: 一切以对象为中心. 一切皆为对象. 具体的某一个事务就是对象 打比方: 大象进冰箱 步骤: 第一步, 开门, 第二步, 装大 ...
随机推荐
- Python 基础教程(第二版)笔记 (1)
P22 除非对 input 有特别的需要,否则应该尽可能使用 raw_input 函数. 长字符串,跨多行,用三个引号代替普通引号.并且不需要使用反斜线进行转义. P23 原始字符串 print r' ...
- java1-3总结 19201421-吴志越
关于最近几次作业,从C语言到Java的过渡,也就是从面向过程到面向对象的过渡.其中,一共有三次作业,前俩次可能更加偏向于过程的设计,利用C语言的想法就可以完成,但是,从需要使用类的开始,就逐渐向对象偏 ...
- C++操作Kafka使用Protobuf进行跨语言数据交互
C++操作Kafka使用Protobuf进行跨语言数据交互 Kafka 是一种分布式的,基于发布 / 订阅的消息系统.主要设计目标如下: 以时间复杂度为 O(1) 的方式提供消息持久化能力,即使对 T ...
- material UI中withStyles和makeStyles的区别
在material UI中,withStyles和makeStyles是经常使用的两个用于封装样式的函数.对于刚使用material UI的开发者而言,可能不太清楚这两者的区别. 本文简要探究 ...
- 使用 html5 FileReader 获取图片, 并异步上传到服务器 (不使用 iframe)
为什么80%的码农都做不了架构师?>>> 原理: 1.使用FileReader 读取图片的base64编码 2.使用ajax,把图片的base64编码post到服务器. 3.根据 ...
- 数学--数论--HDU 4675 GCD of Sequence(莫比乌斯反演+卢卡斯定理求组合数+乘法逆元+快速幂取模)
先放知识点: 莫比乌斯反演 卢卡斯定理求组合数 乘法逆元 快速幂取模 GCD of Sequence Alice is playing a game with Bob. Alice shows N i ...
- USACO 2.1 海明码 Hamming Codes (模拟+位运算+黑科技__builtin_popcount(n))
题目描述 给出 N,B 和 D,要求找出 N 个由0或1组成的编码(1 <= N <= 64),每个编码有 B 位(1 <= B <= 8),使得两两编码之间至少有 D 个单位 ...
- bzoj 4152[AMPPZ2014]The Captain
bzoj 4152[AMPPZ2014]The Captain 给定平面上的n个点,定义(x1,y1)到(x2,y2)的费用为min(|x1-x2|,|y1-y2|),求从1号点走到n号点的最小费用. ...
- python-unittest环境下单独运行一个用例的方法
在unittest单元测试的框架下,想要调出如图所示的绿三角 需要有两个步骤: 1.确定在工具栏中时在unittest模式下运行的,如果为普通模式的话可以通过下三角下拉修改运行环境: 2.在代码中im ...
- P2308 添加括号(dfs记录dp路径)
传送门 \(一看肯定是区间DP(因为和和合并石子很相似,都要加n-1次)\) \(转移方程为(其中he[i][j]是i到j的和)\) \[dp[i][j]=min(dp[i][j],dp[i][k]+ ...