Python函数:
函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可;
定义一个函数
定义一个由自己想要功能的函数,以下是简单的规则:
- 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()。
- 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
- 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
- 函数内容以冒号起始,并且缩进。
- return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
函数名的命名规则:
- 函数名必须以下划线或字母开头,可以包含任意字母、数字或下划线的组合。不能使用任何的标点符号;
- 函数名是区分大小写的。
- 函数名不能是保留字
Python 模块
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。
模块让你能够有逻辑地组织你的 Python 代码段。
把相关的代码分配到一个模块里能让你的代码更好用,更易懂。
模块能定义函数,类和变量,模块里也能包含可执行的代码。
import本质(路径搜索和搜索路径)
直接使用import module_name
语句导入即可;
Python常用模块
- 运行时服务相关模块: copy / pickle / sys / ...
- 数学相关模块: decimal / math / random / ...
- 字符串处理模块: codecs / re / ...
- 文件处理相关模块: shutil / gzip / ...
- 操作系统服务相关模块: datetime / os / time / logging / io / ...
- 进程和线程相关模块: multiprocessing / threading / queue
- 网络应用相关模块: ftplib / http / smtplib / urllib / ...
- Web编程相关模块: cgi / webbrowser
- 数据处理和编码模块: base64 / csv / html.parser / json / xml / ...
Python time strftime()方法
Python time strftime() 函数接收以时间元组,并返回以可读字符串表示的当地时间,格式由参数format决定;
举例:
>>> import time
>>> time_for = '%Y-%m-%d %X'
>>> print(time_for)
%Y-%m-%d %X
>>> print(time.strftime(time_for))
2019-06-20 13:50:46
形参和实参:
形参:形式参数,不是实际存在,是虚拟变量。在定义函数和函数体的时候使用形参,目的是在函数调用时接收实参(实参个数,类型应与实参一一对应);
实参:实际参数,调用函数时传给函数的参数,可以是常量,变量,表达式,函数,传给形参 ;
区别:形参是虚拟的,不占用内存空间,.形参变量只有在被调用时才分配内存单元,实参是一个变量,占用内存空间,数据传送单向,实参传给形参,不能形参传给实参;
函数特性,实例:
import time
def logger(n): #定义函数;
time_format = '%Y-%m-%d %X' #定义时间格式;
time_current = time.strftime(time_format) #接收时间;
#打开日志文件,‘a’追加模式,如果没有此文件系统会自动创建;
with open('日志文件','a') as f:
#%s为占位符,内容为“时间+end action+n(n是随着action1(n)变化的)”;
f.write('%s end action%s \n' % (time_current,n))
def action1(n): #这里action1(n)如果被传参,logger(n)也会随之变化;
print('starting action1...')
logger(n)
def action2(n):
print('starting action2...')
logger(n)
def action3(n):
print('starting action3...')
logger(n)
action1(111) #传入参数
action2(222)
action3(333)
执行结果会自动创建一个日志文件,并写入日志记录:
函数参数:
- 必需参数
- 关键字参数
- 默认参数
- 不定长参数
必须参数:
必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样;
def display_info(name,age):
print('Name: %s' % name)
print('Age: %d' % age)
display_info('xuan',18)
display_info('li', 20)
执行结果:
Name: xuan
Age: 18
Name: li
Age: 20
关键字参数:
关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。
def display_info(name,age):
print('Name: %s' % name)
print('Age: %d' % age)
display_info(age = 18,name = 'xuan')
display_info(age = 40,name = 'laowang')
执行结果:
Name: xuan
Age: 18
Name: laowang
Age: 40
默认参数:
调用函数时,缺省参数的值如果没有传入,则被认为是默认值。下例会打印默认的sex,如果sex没有被传入:
def display_info(name,age,sex='male'):
print('Name: %s' % name)
print('Age: %s' % age)
print('Sex: %s' % sex)
display_info('xuan',18)
display_info('wang',20)
display_info('liu',18,sex = 'female')
执行结果:
Name: xuan
Age: 18
Sex: male
Name: wang
Age: 20
Sex: male
Name: liu
Age: 18
Sex: female
不定长参数:
你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。
加了星号(*)的变量名会存放所有未命名的变量参数。而加(**)的变量名会存放命名的变量参数
不定长参数之加法器:
def add(*args):
print(args)
sum = 0
for i in args:
sum += i
print(sum)
add(1,2,3,4,5)
执行结果:
(1, 2, 3, 4, 5)
15
无命名参数:
def display_info(*args,**kwargs):
print(args)
print(kwargs)
display_info('xuan',18,sex = 'male',job = 'IT')
执行结果:
('xuan', 18)
{'sex': 'male', 'job': 'IT'}
有命名参数:
例1
def display_info(*args,**kwargs):
print(kwargs)
for i in kwargs:
print('%s:%s' % (i,kwargs[i]))
display_info(name = 'xuan', age = 18, sex = 'male', job = 'IT')
执行结果:
{'name': 'xuan', 'age': 18, 'sex': 'male', 'job': 'IT'}
name:xuan
age:18
sex:male
job:IT
例2
def display_info(sex = 'male',*args,**kwargs):
print(args)
print(kwargs)
for i in kwargs:
print('%s:%s' % (i,kwargs[i]))
display_info(1,2,3,'test',name = 'xuan',job = 'IT')
#不定长参数位置优先级:*args放在左边,**kwargs放在右边;
#如果有默认参数,放左边;
#参数优先级举例:def func(name,age=18,*args,**kwargs)
执行结果:
(2, 3, 'test') #这里可以看到1所在位置被“sex = 'male'”给占用掉;
{'name': 'xuan', 'job': 'IT'}
name:xuan
job:IT