函数

函数:定义了之后,可以在任何需要它的地方调用

函数模拟 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 函数的更多相关文章

  1. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  2. 探究javascript对象和数组的异同,及函数变量缓存技巧

    javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...

  3. JavaScript权威指南 - 函数

    函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对 ...

  4. C++对C的函数拓展

    一,内联函数 1.内联函数的概念 C++中的const常量可以用来代替宏常数的定义,例如:用const int a = 10来替换# define a 10.那么C++中是否有什么解决方案来替代宏代码 ...

  5. 菜鸟Python学习笔记第一天:关于一些函数库的使用

    2017年1月3日 星期二 大一学习一门新的计算机语言真的很难,有时候连函数拼写出错查错都能查半天,没办法,谁让我英语太渣. 关于计算机语言的学习我想还是从C语言学习开始为好,Python有很多语言的 ...

  6. javascript中的this与函数讲解

    前言 javascript中没有块级作用域(es6以前),javascript中作用域分为函数作用域和全局作用域.并且,大家可以认为全局作用域其实就是Window函数的函数作用域,我们编写的js代码, ...

  7. 复杂的 Hash 函数组合有意义吗?

    很久以前看到一篇文章,讲某个大网站储存用户口令时,会经过十分复杂的处理.怎么个复杂记不得了,大概就是先 Hash,结果加上一些特殊字符再 Hash,结果再加上些字符.再倒序.再怎么怎么的.再 Hash ...

  8. JS核心系列:浅谈函数的作用域

    一.作用域(scope) 所谓作用域就是:变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的. function scope(){ var foo = "global&quo ...

  9. C++中的时间函数

    C++获取时间函数众多,何时该用什么函数,拿到的是什么时间?该怎么用?很多人都会混淆. 本文是本人经历了几款游戏客户端和服务器开发后,对游戏中时间获取的一点总结. 最早学习游戏客户端时,为了获取最精确 ...

  10. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

随机推荐

  1. 第十六篇-使用CheckBox实现多项选择

    话不多说,先上效果图 屏幕截图方法,全屏截图按键盘print screen就行,活动窗口截图,按住ALT+print screen. 图片默认保存在home/picture路径下.可以通过自带的图片处 ...

  2. 牛客网暑期ACM多校训练营 第九场

    HPrefix Sum study from : https://blog.csdn.net/mitsuha_/article/details/81774727 k较小.分离x和k. 另外的可能:求a ...

  3. PMP学习经验总结——ITTO第六版教材

    今天小编送的都是干货哦!大家可以收藏一下对学习PMP和项目管理都有很大收获. 4.1 制定项目章程——启动——一次或仅在项目的预定义点开展 概念:编写一份正式批准项目并授权项目经理在项目活动中使用组织 ...

  4. function call操作符(operator()) 仿函数(functor)

    主要是需要某种特殊的东西来代表一整组操作 代表一整组操作的当然是函数,过去通过函数指针实现 所以STL算法的特殊版本所接受的所谓条件或策略或一整组操作都以仿函数的形式呈现 #include <i ...

  5. C语言进阶——Day 1

    C语言提高笔记 Day 1 小数据赋给大变量,首位是1则在前面自动补充1,首位是0则在前方自动补充0. 大数据赋给小变量,低位字节对齐,truncate截断,有可能会造成数据丢失. 程序和进程的差别: ...

  6. linux环境java入门

    1. 安装java开发环境 安装jre和jdk $ sudo apt-get install default-jre$ sudo apt-get install default-jdk 2. 设置环境 ...

  7. Advertising.csv

    TV,radio,newspaper,sales1,230.1,37.8,69.2,22.12,44.5,39.3,45.1,10.43,17.2,45.9,69.3,9.34,151.5,41.3, ...

  8. Thymeleaf中的&&解析问题

    1.问题: 最近使用了新的html模板thymeleaf..在模板里使用js语法时遇到问题,&&不能正确的被解析,使用if(a&&b){}可以通过模板解析,但是浏览器上 ...

  9. JavaScript中的this指向规则

    首先,JavaScript的this指向问题并非传说中的那么难,不难的是机制并不复杂,而被认为不好理解的是逻辑关系和容易混淆的执行上下文.这篇博客也就会基于这两个不好理解的角度来展开,如要要严格的来对 ...

  10. bzoj千题计划315:bzoj3172: [Tjoi2013]单词(AC自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3172 构建AC自动机 在fail树上,点i的子树大小 表示trie树上根节点到i构成的单词 是 多 ...