22 python入门指南:函数

Posted awildfish

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了22 python入门指南:函数相关的知识,希望对你有一定的参考价值。

#!/bin/python

def test_func():
    return "test_func"

a = test_func()
print(a)

输出结果:

test_func

 

形式2:带两个参数,返回他们的乘积值

#!/bin/python

#return a * b
#a: int | float
#b: int | float
def multiply(a, b):
    return a * b

t = multiply(100, 20)
print(t)

输出结果:2000

这里需要对两个参数说明下,包括他们的类型。因为python是动态语言,定义函数的时候不需要明确指出参数的类型,正因为这样松散的约定,所以比较推荐的做法就是:

靠开发来保证参数的类型说明,否则后续很难阅读。

 

形式3:其中一个参数是有默认值的

#return a * b
#a: int | float
#b: int | float
def multiplyByDefault10(a, b = 10):
    return a * b

t = multiplyByDefault10(100)
print(t)

输出结果:1000

 

高级主题4:参数是引用传递还是值传递

参考问题:https://www.zhihu.com/question/20591688

所有函数都是引用传递,只是对于不可变类型的变量(int,float,string),会重新开辟一个空间;对于可变类型(dict,list等),是直接引用传递,操作数据时直接修改的原始变量。

这点和c,php是不一样的,c可以传递指针,php可以传递引用,强制修改外部变量。

 

高级主题5:可变参数的函数如何定义,如何使用?

5.1,参数列表为tuple类型,只有value,没有key

def print_changeable_args(*args):
    print(args)

print_changeable_args(1, 2, 3)

输出结果:

(1, 2, 3)

如果调用处改为:print_changeable_args(a=1, b=2, c=3)

会报错:TypeError: print_changeable_args() got an unexpected keyword argument ‘a‘

 

5.2,参数列表为dict类型,有key,也有value

def print_changeable_args_dict(**args):
    print(args)

print_changeable_args_dict(a=1, b=2)

输出结果:

{a: 1, b: 2}

如果调用处改为tuple方式:print_changeable_args_dict(1, 2)

报错:TypeError: print_changeable_args_dict() takes 0 positional arguments but 2 were given

 

5.3,不定参数中既有tuple,又有dict类型

实际中很少出现这种情况,通常dict类型就可以搞定所有的情况。

def print_changeable_tuple_dict(* argv1, ** argv2):
    print(argv1)
    print(argv2)

print_changeable_tuple_dict(1, 2, 3)
print_changeable_tuple_dict(1, 2, 3, a=1, b=2)

输出:

(1, 2, 3)
{}
(1, 2, 3)
{b: 2, a: 1}

以上是正常情况。

异常1:如果最开始没有tuple参数,直接使用dict参数,结果如何?

print_changeable_tuple_dict(a=1, b=2)

输出:

()
{b: 2, a: 1}

异常2:如果tuple没有,dict也没有,结果如何?

print_changeable_tuple_dict()
输出:
()
{}

 

异常3:如果tuple有,dict也有,但是他们是乱序的。

print_changeable_tuple_dict(a=1, 1)
报错:SyntaxError: positional argument follows keyword argument


print_changeable_tuple_dict(1, 2, 3, a=1, b=2, c=3, 4) 
报错:SyntaxError: positional argument follows keyword argument

可以看到tuple不能出现在dict后面。

 

5.3,不定参数中既有tuple,又有dict类型,但是参数定义时dict在前,tuple在后

def print_changeable_dict_tuple(**argv1, *argv2):
    print(argv1)
    print(argv2)

print_changeable_dict_tuple(a=1)

报错:

    def print_changeable_dict_tuple(**argv1, *argv2):
                                           ^
SyntaxError: invalid syntax

 6,作为包函数来被其它文件所使用

a,我们来构造一个函数

#!/bin/python
#!--encoding: UTF-8

#fname(string): write file name
#content(string): write content to fname
def write_sth_to_file(fname, content):
    fp = open(fname, a+)
    fp.write(content + "
")
    fp.close()

保存为helper.py。

b,创建函数调用者example.py,这里必须和helper.py放在同一文件夹下

#!/bin/python

import helper

helper.write_sth_to_file(/tmp/aaa.log, This is example)

我们使用到a中的函数write_sth_to_file。

执行结果就是把字符串附加到文件/tmp/aaa.log中。

这里函数作为包中的一个单元被引入到其它文件中,是将来组建大型项目中必备的机制。

 

这里有个疑问点需要解释下?为什么可以直接import helper就可以用呢?引用其它的包可以吗?这里引入的规则是什么?

import查找包的逻辑是:

a,优先加载和执行文件同一目录下的库,(example.py下如果有helper.py,则优先加载该文件,如果没有则继续查找);

b,加载python的内置库(我本地是/usr/lib/python3.5/helper.py,如果没找到,则继续查找);

c,加载python的个人local目录下的三方库(我本地是.local/lib/python3.5/site-packages/helper.py);

d,加载python的三方包(我本地是/usr/local/lib/python3.5/dist-packages/helper.py);

以上是关于22 python入门指南:函数的主要内容,如果未能解决你的问题,请参考以下文章

Python学习(22):模块

Python 函数声明和调用

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段

你如何在 python 中处理 graphql 查询和片段?

我在哪里更改此 Python 代码片段以将临时文件保存在 tmp 文件夹中?

22.java方法的定义