day 9 - 1 函数
函数
函数:定义了之后,可以在任何需要它的地方调用
函数模拟 len() 方法
#len() 方法的使用
s="世界上唯一不变的就是变化"
print(len(s))
#下面是我们常用的 len() 方法的使用
s="世界上唯一不变的就是变化"
print(len(s)) #下面我们来使用函数模拟 len() 方法
s="世界上唯一不变的就是变化"
def my_len(): #def 关键字定义函数 声明函数
i=0
for j in s:
i=i+1
print(i)
my_len() #调用函数
这样我们便实现了使用函数来计算长度的功能,但这并不是我们想要的
与 len() 相比的不同
1.不能变,只能计算 s 字符串的长度
2.只是输出了结果
3.没有返回值
我们先来解决返回值的问题(还有 print() 打印结果的问题)
s="世界上唯一不变的就是变化"
def my_len():
i=0
for j in s:
i=i+1
return i #设定返回值 #然后我们可以赋值的调取
length = my_len()
print(length) #我们也可以直接调取,是不是发现什么
print(my_len()) #是不是和下面 len() 又相近了些
s="世界上唯一不变的就是变化"
print(len(s))
返回值
return 表示结束一个函数
与 break 的区别:break 跳出循环,函数的循环后面如果还有内容,则继续执行
return 直接结束函数
return 的作用:执行过该关键字后,不在实行后面的内容
下面我们来看看返回值的各种情况
1.没有返回值——当没有返回值时 默认为 None
1)不写 return——常用
2)只写 return——常用
1.21、与 break 的区别
3) return None——最不常用
2.返回一个值
1)数字、字符串、列表、字典 都是可以的,即可以返回任何数据类型
注意:
1. 只要返回就可以接守
2. 如果在一个程序中有多个 return,那么只执行第一个
3.返回多个值
1)多个返回值用多个变量接受,有几个返回值就用多少变量接收
2)如果多个值,用一个返回值来接收,则返回一个元组
#1.1 不写 return——常用
def func():
s = ['anc','ghj']
for j in s:
print(j)
value = func()
print(value) #1.2 只写 return——常用
def func():
s = ['anc','ghj']
for j in s:
print(j)
return
value = func()
print(value) #1.21 与 break 的区别
def func():
s = ['anc','ghj']
for j in s:
print(j)
# break #当执行 break 时,循环将不再进行 而打印下面“=”
return #当执行 return 时,停止循环且不执行 “=”
print('='*10)
ret = func()
print(ret) #1.3 return None——最不常用
def func():
s = ['anc','ghj']
for j in s:
print(j)
return None
print('='*10)
ret = func()
print(ret)
#2.1 返回一个值
def func():
return ['f','g']
print(func()) #3.1 多个返回值用多个变量接受
def func2():
return 1,2
r1,r2 = func2()
print(r1)
print(r1) #3.2 多个值,用一个返回值来接收
def func2():
return 1,2
r1 = func2()
print(r1)
我们接着来解决(不能变,只能计算 s 字符串的长度)的问题
使用形式参数来接收参数的方式,使 my_len 可以处理任意实际参数的值
在使用形式参数来写函数时,形式参数不必有对应的值
def my_len(s): #自定义函数只需要 0 个参数,此处为接收参数或叫形式参数,简称:形参
i=0 #注意:形参处的 s 值必须与 for 循环中 s 值保持一致
for j in s:
i=i+1
return i #采用形式函数时,此处没有 return 时,值返回 None
#print(my_len()) #这样写就会报错,此处为传递参数或叫实际参数,或叫实参(因为没传递参数) k="习惯是十倍的天性"
s="世界上唯一不变的就是变化"
ret = my_len(s) #传参
ret2 = my_len(k)
ret3 = my_len([1,2,3])
print(ret)
print(ret2)
print(ret3) #或者
print(my_len(s))
print(my_len(k))
print(my_len([1,2,3])) #有没有发现和下面 len() 方法的使用变得一致了
s="世界上唯一不变的就是变化"
print(len(s))
参数
下面我们来较为详细的了解下参数
#参数
#没有参数
#定义函数和调用函数时括号里都不写内容
#有一个参数
#传什么就是什么
#有多个参数
#位置参数 #下面我们来看下位置参数
def my_sum(a,b):
print(a,b)
res=a+b #result
return res #我们来重点看下 a b 的值分别是什么,因为结果都是一样的
ret=my_sum(12,23) # 12 23
print(ret) ret2 = my_sum(b=23,a=12) #这里为关键字传参,即指定参数对应的位置
print(ret2) # 12 23 ret3 = my_sum(23,12) # 23 12
print(ret3)
站在实参的角度上
按照位置传参
按照关键字传参
混着用可以:但是 必须先按照位置传参,再按照关键字传参数
注意:不能给同一个变量传多个值
站在形参的角度上
位置参数:必须传,且有几个参数就传几个值
默认参数:可以不传,如果不传就是用默认的参数,如果传了就用所传的参数
下面我们来了解下默认参数
#带默认参数的函数
def classmate(name,sex='男'): #参数中有俩个值:形参,默认参数性别为男
print('%s: %s'%(name,sex)) #适合于在输入某些值时,大多的值是相同的情况
classmate('诺娃',"女")
classmate('雷诺')
classmate('萨尔')
只有调用函数的时候
按照位置传:直接写参数的值
按照关键字:关键字 = 值
定义函数的时候:
位置参数:直接定义参数
默认参数,关键字参数:参数名 = '默认的值'
动态参数:可以接受任意多个参数
参数名之前加 *,习惯参数名 args
参数名之前加 **,习惯参数名 kwargs
顺序:位置参数,*args,默认参数,**kwargs
下面我们来了解下动态参数
###动态参数
#求任意数的和
def sum(*args): #关键字“*”
n=0
for i in args:
n+=i
return n print(sum(12,23,13))
print(sum(14,25,36,123))
#注意:**kwargs 只能接受关键字传参
def func(**kwargs): #关键字“**”
print(kwargs) func(a = 1,b = 2,c = 3)
func(a = 1,b = 2)
func(a = 1)
func(1,2,c = 3) #报错 **kwargs 只能接收关键字传参的值
下面我们较为详细的了解下动态参数
动态参数有两种:可以接受任意个参数
1. *args 只接收位置参数的值,不能接收关键字传参的值
组织成一个元组
2. **kwargs 只能接收关键字传参的值
组织成一个字典
3. args 必须在 kwargs 之前
#注意:传参时必须先传位置参数在传关键字参数
def func(*args,**kwargs):
print(args,kwargs)
func(1,2,3,4,a='',b='')#传参时必须先传位置参数在传关键字参数
#动态参数的另一种传参方式
def func(*args): #站在形参的角度上,给变量加上*,就是组合所有传来的值
print(args)
func(1,2,3,4,5) l=[1,2,3,4,5]
func(*l) #站在实参的角度上,给一个序列加上*,就是将这个序列按照顺序打散 #**kwargs 与 *args 逻辑一样,类推就可以了
def func(**kwargs):
print(kwargs)
func(a=1,b=2,c=3) d={'a':4,'b':5,'c':6}
func(**d)
函数的注释
def func():
#这个函数实现了什么功能
#参数1:
#参数2:
#:return: 是字符串或者列表的长度
pass
默认参数的陷阱
如果默认参数的值是一个可变数据类型
那么每一次调用函数的时候
如果不传值就公用这个数据类型的资源
def qqxing(f = []):
f.append(1)
print(f)
qqxing([]) #表示使用了自定义参数
qqxing() #表示使用了默认参数 所以下面每次调用参数都在同一个列表中递增
qqxing()
qqxing() def qqxing2(k,f={}):
f[k] = 'v'
print(f) qqxing2(1)
qqxing2(2)
qqxing2(3)
###回顾
函数
1.函数的定义 def
2.函数的调用
3.函数的返回值 return
4.函数的参数
形参:
位置参数:必须传
*args:可以接收任意多个位置参数
默认参数:可以不传
**kwargs:可以接收多个关键字参数
实参:按照位置传参,按照关键字传参
day 9 - 1 函数的更多相关文章
- Python 小而美的函数
python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况 any any(iterable) ...
- 探究javascript对象和数组的异同,及函数变量缓存技巧
javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...
- JavaScript权威指南 - 函数
函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...
- C++对C的函数拓展
一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...
- 菜鸟Python学习笔记第一天:关于一些函数库的使用
2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...
- javascript中的this与函数讲解
前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...
- 复杂的 Hash 函数组合有意义吗?
很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...
- JS核心系列:浅谈函数的作用域
一.作用域(scope) 所谓作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. function scope(){ var foo = "global&quo ...
- C++中的时间函数
C++获取时间函数众多,何时该用什么函数,拿到的是什么时间?该怎么用?很多人都会混淆. 本文是本人经历了几款游戏客户端和服务器开发后,对游戏中时间获取的一点总结. 最早学习游戏客户端时,为了获取最精确 ...
- Python高手之路【四】python函数装饰器
def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...
随机推荐
- django 前端 js让一段文本中包含的网址可以被访问
这个功能还是挺刚需的,下面说说实现过程,用到了正则表达式. 1.原本的html部分代码: <h4 id="softadd">链接: https://pan.baidu. ...
- python中的单例模式、元类
单例模式 单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在.当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场. ...
- /bin/bash^M:损坏的解释器: 没有那个文件或目录
由于在Windows下换行是\n\r,在Linux下打开多了\r,所以需要删除.删除命令 :sed -i 's/\r$//' filename -i插入 s替代模式 \r$表示任何以\r结束的字符 整 ...
- hdu 4279"Number"(数论)
传送门 参考资料: [1]:https://www.2cto.com/kf/201308/233613.html 题意,题解在上述参考资料中已经介绍的非常详细了,接下来的内容只是记录一下我的理解: 我 ...
- JS重点整理之JS原型链彻底搞清楚
对象 要清楚原型链,首先要弄清楚对象: 普通对象 最普通的对象:有__proto__属性(指向其原型链),没有prototype属性. 原型对象(person.prototype 原型对象还有cons ...
- 高级组件——弹出式菜单JPopupMenu
弹出式菜单JPopupMenu,需要用到鼠标事件.MouseListener必须要实现所有接口,MouseAdapter是类,只写你关心的方法,即MouseAdapter实现了MouseListene ...
- Qt ------ QFileDialog
QString strFile = QFileDialog::getOpenFileName(this,QStringLiteral("选择Excel文件"),"&quo ...
- lucene创建索引的几种方式(一)
什么是索引: 根据你输入的值去找,这个值就是索引 第一种创建索引的方式: 根据文件来生成索引,如后缀为.txt等的文件 步骤: 第一步:FSDirectory.open(Paths.get(url)) ...
- 图论分支-差分约束-SPFA系统
据说差分约束有很多种,但是我学过的只有SPFA求差分: 我们知道,例如 A-B<=C,那么这就是一个差分约束. 比如说,著名的三角形差分约束,这个大家都是知道的,什么两边之差小于第三边啦,等等等 ...
- scrapy 基础
安装略过 创建一个项目 scrapy startproject MySpider #或者创建时存储日志scrapy startproject --logfile='../logf.log' MySpi ...