python 函数

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

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

定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可

特性:

1.减少重复代码

2.使程序变的可扩展

3.使程序变得易维护

语法定义

#函数名
def sayhi():
    print("Hello, I'm nobody!")

 调用函数

sayhi()

执行输出

Hello, I'm nobody!

下面有2个函数

def test1():
    print('in the test1')
    #记录日志
    with open('a.txt','a+') as f:
        f.write('end action\n')

def test2():
    print('in the test2')
    # 记录日志
    with open('a.txt','a+') as f:
        f.write('end action\n')

test1()
test2()

可以看出记录日志部分,代码重复了。那么重复的代码,可以封装成一个函数,方便调用。

优化后的代码如下:

#记录日志
def logger():
    with open('a.txt','a+') as f:
        f.write('end action\n')

def test1():
    print('in the test1')
    logger()

def test2():
    print('in the test2')
    logger()

test1()
test2()

执行程序,查看日志文件

end action

end action

下面来了一个需求,加上记录时间

只需要更改logger()函数,就可以让其他函数调用时,自动生效。

import time
#记录日志
def logger():
    #时间格式
    time_format = '%Y-%m-%d %X'
    #strftime获取当前时间,应用定义好的时间格式
    time_current = time.strftime(time_format)
    with open('a.txt','a+') as f:
        f.write('%s end action\n' %time_current)

def test1():
    print('in the test1')
    logger()

def test2():
    print('in the test2')
    logger()

test1()
test2()

查看文件内容

end action

end action

2018-02-25 14:56:43 end action

2018-02-25 14:56:43 end action

函数返回值

要想获取函数的执行结果,就可以用return语句把结果返回

举个例子:

def test1():
    print('in the test1')
    return 0
    print('test end')

test1()

执行输出

in the test1

为什么没有输出test end ?

注意:

函数在执行过程中只要遇到return语句,就会停止执行并返回结果,so 也可以理解为 return 语句代表着函数的结束

如果未在函数中指定return,那这个函数的返回值为None

函数的返回值,有3种情况

def test1():
    print('in the test1')

def test2():
    print('in the test2')
    return 0
def test3():
    print('in the test3')
    return 1,'hello',['alex','wupeiqi'],{'name':'alex'}

x=test1()
y=test2()
z=test3()
print(x)
print(y)
print(z)

执行输出

in the test1

in the test2

in the test3

None

0

(1, 'hello', ['alex', 'wupeiqi'], {'name': 'alex'})

总结:

1.当函数没有返回值时,默认返回None

2.函数只有一个返回值,返回一个

3.函数有多个值,返回一个元组

函数的返回值,可以是任意对象,比如数字,列表,函数...

函数为什么要有返回值呢?

某些情况下,调用函数的时候,需要知道函数的返回值。后续的程序逻辑会根据返回值,做进一步判断。

比如一个用户登录函数,登录成功,返回true,否则返回false

函数参数

函数在执行的时候,也可以带参数

#形参
def test(x,y):
    print(x,y)

#实参
test(1,2)

执行输出 1 2

形参:全称为“形式参数”是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数。

实参:可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。

形参和实参 按照顺序,是一一对应的,个数不能多。

关键参数

正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可。

def test(x,y):
    print(x,y)

test(y=1,x=2)

执行输出 2 1

函数执行,同时用 关键参数和位置参数

def test(x,y):
    print(x,y)

test(x=1,2)

执行输出

SyntaxError: positional argument follows keyword argument

为什么呢?

关键参数必须放在位置参数之后。

def test(x,y):
    print(x,y)

test(1,y=2)

执行输出 1 2 

默认参数

def test(x,y=2):
    print(x,y)

test(1)

执行输出 1 2 

由于y已经有了一个默认参数,所以执行的时候,只传一个参数即可。

默认参数也可以传参数

def test(x,y=2):
    print(x,y)

test(1,3)

执行输出 1 3

默认参数的特点:

调用函数的时候,默认参数非必填项

用途:提前固定参数

非固定参数

def test(*args):
    print(args)

test(1,2,3,4,5)

执行输出 (1, 2, 3, 4, 5)

*args 表示一个 非固定参数

若你的函数在定义时不确定用户想传入多少个参数,就可以使用非固定参数

def test(x,*args):
    print(x)
    print(args)

test(1,2,3,4,5)

执行输出

1

(2, 3, 4, 5)

把N个关键字参数,转换成字典的方式

def test(**kwargs):
    print(kwargs)

test(name='zhang',age=12)

执行输出

{'name': 'zhang', 'age': 12}

python中,函数的参数除了最基本的必选参数,默认参数外,主要包含以下几种特殊的参数类型:可变参数,关键字参数,命名关键字参数。它们的存在,使得函数的参数更加自由。在函数定义时,

他们定义的顺序为:必选参数、默认参数、可变参数、命名关键字参数和关键字参数

匿名函数 

匿名函数就是不需要显式的指定函数

使用 lambda 来创建匿名函数。

lambda只是一个表达式,函数体比def简单很多。

lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。

lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。

lambda函数只能写一行

应用场景

如果一个方法,整个程序只用一次,不会涉及其他程序调用。

没有必要单独写一个函数,函数的重要功能就是重复使用。

这种情况下,可以写一个匿名函数,用完就释放了。

语法

lambda函数的语法只包含一个语句,如下:

lambda [arg1 [,arg2,.....argn]]:expression

举个例子

def calc(n):
    return n ** n

print(calc(10))

换成匿名函数

calc = lambda n: n ** n
print(calc(10))

执行输出

10000000000

再复杂一点的

def calc(n):
    print(n)
    for i in range(n):
        print(i)

print(calc(10))

这个就没法转成匿名函数了

匿名函数还可以用于三元运算

calc = lambda n:3 if n<4 else n
print(calc(10))

执行输出10

因为n小于3,输出n,那么n就是10

匿名函数很少单独使用,一般和其他函数配合使用

比如过滤大于5的数字

res = filter(lambda n:n>5,range(10))
for i in res:
    print(i)

执行输出

6

7

8

9

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏python3

python字符串

1.    S.find(substr,[start,[end]])    返回S中出现substr的第一个字母的标号,如果S中没有substr则返回-1,st...

862
来自专栏web前端教室

十一国庆节 之 “变量与函数同名时,会输出谁?”

看这样一个题目: b = function c() { a = 1, b = 2, c = 3; console.log(a); //1 ...

18310
来自专栏淡定的博客

python入门基础语法总结

1013
来自专栏微信公众号:Java团长

3张图彻底了解Java中字符串的不变性

一旦一个string对象在内存(堆)中被创建出来,他就无法被修改。特别要注意的是,String类的所有方法都没有改变字符串本身的值,都是返回了一个新的对象。

612
来自专栏marsggbo

C++学习笔记之模板篇

一、模板 不管是函数模板还是类模板,在未初始化前都是不占用内存的。 另外一般来说模板代码不能分开编译,即不能分开写成.h文件和.c文件,需要写成一个文件。 ...

2098
来自专栏Python爬虫与数据挖掘

Python正则表达式初识(三)

前几天给大家分享了Python正则表达式基础(一)和Python正则表达式基础(二),感兴趣的小伙伴可以点击进去学习,今天继续给大家分享Python正则表达式基...

1013
来自专栏GreenLeaves

Jquery 遍历数组之grep()方法介绍

grep()方法用于数组元素过滤筛选。 grep(array,callback,boolean);方法参数介绍。 array   ---待处理数组 callba...

1915
来自专栏大前端_Web

js浮点数加减乘除

版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/articl...

1333
来自专栏magicsoar

C++编译与链接(0)-.h与.cpp中的定义与声明

C++中有的东西需要放在可以在.h文件中定义,有的东西则必须放在.cpp文件中定义,有的东西在不同的cpp文件中的名字可以一样,而有的则不能一样 那么究竟哪些东...

4997
来自专栏函数式编程语言及工具

泛函编程(4)-深入Scala函数类

既然是泛函编程,多了解一下函数自然是免不了的了: 方法(Method)不等于函数(Function) 方法不是函数但可以转化成函数;可以手工转换或者由编译器(c...

19610

扫码关注云+社区

领取腾讯云代金券