函数
函数就是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取一个名字。
可以通过函数名在程序的不同地方多次执行(这通常叫函数调用)。
预定义函数
可以直接使用
自定义函数
用户自己编写
为什么使用函数
降低编程难度
-通常将一个复杂的大问题分解成一系列的小问题,然后将小问题划分成更小的问题,当问题细化为足够简单是,我们就可以分而治之。各个小问题解决了,大问题就迎刃而解了。
代码重用
-避免重复劳作,提供效率
函数的定义和调用
-def函数名([参数列表]): //定义
-函数名([参数列表]): //调用
#!/usr/bin/env python# _*_ coding:utf-8 _*_# @Time : 2017/11/30 23:52# @Author : name# @File : 8.pydef fun():sth = raw_input("Please input something: ")try:if type(int(sth)) == type(1):print("%s is a number" % sth)except ValueError:print("%s is not number" % sth)fun()
函数参数
形式参数和实际参数
-在定义函数时,函数名后面括号中的变量名称叫做“形式参数”,或者成为“形参”
-在调用函数时,函数名后面括号中的变量名称叫做“实际参数”,或者成为“实参”
#!/usr/bin/env python# _*_ coding:utf-8 _*_# @Time : 2017/12/1 21:41# @Author : name# @File : 9.pyimport sysdef isNum(s): for i in s: if i in '0123456789': pass else: print("%s is not a number" %s) sys.exit() else: print("%s is a number" %s)isNum(sys.argv[1])
练习
打印系统的所有的PID
要求从/proc读取
os.listdir()
#!/usr/bin/env python# _*_ coding:utf-8 _*_# @Time : 2017/12/1 21:41# @Author : name# @File : 9.pyimport osimport sysdef isNum(s): for i in s: if i in '0123456789': pass else: #print("%s is not a number" %s) #sys.exit() break else: print(s)for p in os.listdir('/proc'): isNum(p)
函数默认参数
缺省参数(默认参数)
def fun(x,y = 100):
print(x, y)
fun(1,2)
fun(1)
函数变量
局部变量和全局变量
-python中的任何变量都有特定的作用域
-在函数中定义的变量一般只能在该函数内部使用,这些只能在程序的特定部分使用的变量,我们称之为局部变量
-在一个文件顶部定义的变量可以供文件中的任何函数调用,这些可以为整个程序所使用的变量成为全局变量
global #在函数中将变量声明成全局变量
locals() #在函数中打印函数中的变量,在函数外,打印所有变量
函数返回值
-函数被调用后会返回一个指定的值
-函数调用后默认返回None
-return返回值
-返回值可以是任意类型
-return执行后,函数终止
-return与print区别
#!/usr/bin/env python# _*_ coding:utf-8 _*_# @Time : 2017/12/1 21:52# @Author : name# @File : 10.pyimport osdef isNum(s):for i in s:if s.isdigit():return Truereturn Falsefor p in os.listdir('/proc'):if isNum(p):print(p)
多类型传值
def fun(x, y, z):
return x + y + z
t1 = (1, 2, 3)
fun(*t1)
fun(*(2, 3, 4))
fic = {'x': 1, 'y': 3, 'z': 4}
fun(**dic)
冗余参数
向函数传元组和字典
处理多余实参
def fun(x, y, *args, **kwargs)
函数
递归调用
计算阶乘
普通方法:
-使用循环
#!/usr/bin/env python# _*_ coding:utf-8 _*_# @Time : 2017/12/3 19:16# @Author : name# @File : 12.pydef factorial(n): sum = 1 for i in xrange(1, n+1): sum *= i return sumprint(factorial(5))
递归的注意事项
必须有最后的默认结果
if n == 0
递归参数必须向默认结果收敛的:
factorial(n-1)
#!/usr/bin/env python# _*_ coding:utf-8 _*_# @Time : 2017/12/3 20:00# @Author : name# @File : 13.pydef factorial(n): if n == 0: return 1 else : return n * factorial(n-1)print(factorial(5))
小练习
打印目录下所有文件
#!/usr/bin/env python# _*_ coding:utf-8 _*_# @Time : 2017/12/3 20:04# @Author : name# @File : 14.pyimport osimport sysdef print_files(path): lsdir = os.listdir(path) dirs = [i for i in lsdir if os.path.isdir(os.path.join(path, i)) ] files = [i for i in lsdir if os.path.isfile(os.path.join(path, i))] if files: for f in files: print os.path.join(path, f) if dirs: for d in dirs: print_files(os.path.join(path, d))print_files(sys.argv[1])
匿名函数
lambda函数是一种快速定义单行的最小函数,可以用在任何需要函数的地方。
def fun(x,y):
return x * y
fun(2, 3)
r = lambda x,y: x * y
r(2, 3)
匿名函数的优点:
-1. 使用python写一些脚本是,使用lambda可以省去定义函数的过程,让代码更加精简。
-2. 对于一些抽象的,不会被别的地方再重复使用的函数,有时候函数起个名字也是个难题,使用lambda不需要考虑命名的问题。
-3. 使用lambda在某些时候让代码更容易理解。
lambda基础
lambda语句中,冒号前是参数,可以有多个,逗号隔开,冒号右边是返回值。
lambda语句构建的其实是一个函数对象。
def add (x, y):
return x + y
sum = reduce(add,[1, 2, 3])
reduce(lambda x, y : x + y, range(1,4))
内置函数
可以查看python的内置函数的使用方法
例子
返回数字的绝对值
abc(-12)
取列表最大最小值
max([1, 2, 3, 4, 5])
min([1, 2, 3, 4, 5])
常用函数
绝对值,最大最小值
abs() #绝对值
max() #最大值
min() #最小值
len() #序列长度
divmod() #
pow()
round()
callable()
type()
isnstance
cmp()
range()
xrange()
类型转换函数
int()
long()
float()
comples()
str()
list()
tuple()
hex() #16进制
oct() #8进制
chr()
ord()
eval()
字符串处理函数(字符串的方法)
str.capitalize()
str.replace()
str.split()
str.join()
string模块
序列处理函数
len() #取序列的长度
max() #取序列的最大值
min() #取序列的最小值
filter()
zip()
map()
reduce()
使用lambda
filter(lambda x:x % 2 == 0, range(10))
[0, 2, 4, 6, 8]
map(lambda x, y: x * y, range(5), range(5))
[0, 1, 4, 9, 16]
reduce(lambda x, y: x + y, range(1,101))
5050
列表表达式
[i * 2 + 10 for i in range(10)]
[10, 12, 14, 16, 18, 20, 22, 24, 26, 28]
[i for i in range(10) if i%3 == 0]
[0, 3, 6, 9]
模块使用
模块是python组织代码的基本方式
一个python脚本可以单独运行,也可以导入到另一个脚本中运行,当脚本被导入运行时,我们将其称为模块(module)
所有的.py文件都可以作为一个模块导入
模块名与脚本的文件名相同
例如我们编写了一些名为hello.py的脚本,则可以在另一个脚本中用import hello语句来导入它
包
python的模块可以按目录组织为包
创建一个包的步骤:
-创建一个名字为包名的目录
-在该目录下创建一个__init__.py文件
-根据需要,在该目录下存放脚本文件或已编译的扩展及子包
-import pack.mi,pack.m2,pack.m3
python path
sys.path
export PYTHONPATH