Python函数、模块

函数

定义

规则

1、函数代码块以def关键字开头,后接函数表示符号名称和圆括号()

2、任何从外部传入的参数必须在圆括号中

3、函数第一行语句可以注释的方式写一下函数的作用(可选)

4、函数内容以冒号起始,并且缩进。return [表达式]来结束函数,选择性的返回一个值给调用方

5、不带return的返回值相当于返回None

缩进四个

例如:

1
2
3
def add (a, b):
return a + b
print(add(5, 19))

输出:24

位置参数和关键字参数

关键字参数可以通过关键字来传入实参,如:

1
2
3
4
5
def add (a, b):
print('a:', a)
print('b:', b)

add(b = 1, a = 2)

输出:a=2,b=1

如果前面通过关键字参数进行了传参,后面就不能使用位置参数继续传参。

默认参数

例如:

1
2
3
4
5
def add(a, b = 10):
return a + b

print(add(5))
print(add(6, 39))

输出:14和45

不定长参数

参数长度不确定,一般不会声明具体变量。所有不定参数用*表示,所有不定参数组成一个元组。例如:

1
2
3
4
5
6
7
def printinfo(argc, *vartuple):
print(len(vartuple))
if len(vartuple > 0):
print([x for x in vartuple])
print('a:', argc)

printinfo(3, 4, 5, 'hello', {'name' : 'liuzhongxia'})

输出:4

[4, 5, ‘hello’, {‘name’: ‘liuzhongxia’}]

a: 3

使用**的话则会创建一个不定长参数的字典而非元组,传的时候传的是关键字参数.例如

1
2
3
def myfunc(*args, **kwargs):
for k, v in kwargs.items():
print(k, v)

也可以使用单独的一个\在函数中,但是要注意单独出现*的时候,后面的参数必须要用关键字来传入,例如:*

1
2
3
4
def f(a,b,*,c):
return a+b+c

f(1,2,c=3) # 正常

输出:6

在函数中使用\后跟一个列表,则会自动解包,吧列表中的元素作为参数传到不定长参数里,例如:*

1
2
3
4
5
6
7
8
9
def myfunc(a, b, *args):
print(len(args))

if(len(args) > 0):
for arg in args:
print(arg)

alist = [11, 22, 33, 44]
myfunc(3, 4, *list)

注意此处 *list 的用法

匿名函数Lambda

lambda关键字能创建小型匿名函数,lambda函数可以省去函数创建的过程,提高代码效率。例如:

1
2
func = lambda x, y, z : x + y + z
func(1, 2, 3)

lambda表达式也可以接受没有参数的函数,即前面没有参数,直接是冒号,后面跟表达式

lambda表达式不能含有命令,而且只能有一条表达式

模块-导入

什么是模块

任何.py文件都是一个独立的模块。文件=模块

方法一

1
import module #打包把指定模块的所有资源全部导入,通过模块名来调用,如module.func()

方法二

1
2
3
4
from module import funcname # 导入单个方法
from module import fa, fb, fc #导入多个方法
from module import classname #导入类
from module import * #导入所有资源

from module import \ 和 import module 区别:前者不用通过模块名来调用*

规范

1、如果要经常访问模块的属性和方法,使用

1
from module import *

2、如果想要有选择地导入某些属性和方法,可以使用

1
from module import fa, fb, fc

3、如果模块包含的属性和方法与你的某个模块同名,必须使用

1
import module

来避免名字冲突

4、尽量少用

1
from module import *

因为不好判断变量和函数来自哪里(namespace污染)

关于 if __name__ = \’_main\_‘

__name__:是Python的内置对象,可以通过print该属性的形式来判断该模块是否是通过导入的方式来运行的。如果当前模块是自主运行的,那么__name__=__main__。这行语句并不是入口函数。Python没有程序入口一说

这行语句的目的是让模块内的某些代码只有在其作为直接执行的文件而非被别人import进来的文件时才执行。

关于全局变量的使用

直接读取全局变量的时候可以不使用global关键字,如果赋值的话,则要加上global关键字,如:

1
2
3
4
5
test = 0
def func():
print(test)
golbal test = 1
print(test)

可变的数据类型在修改时不需要加上global。不可变的数据类型在修改时要加global