继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Python学习之 函数篇

沧海一幻觉
关注TA
已关注
手记 328
粉丝 34
获赞 198

Python函数
函数就是完成特定功能的一个语句组,这组语句可以作为一个单位使用,并且给它取一个名字。
可以通过函数名在程序的不同地方多次执行(这通常叫函数调用)。

函数定义要在函数调用之前,否则函数调用会找不到要调用的函数  跟编译型语言不一样!!!!!!!!!

 

函数要写在python文件的最前面,否则NameError: name 'wordCount' is not defined


import osimport sysimport string






s="""hello world python"""wordCount(s)def wordCount(s):
    chars=len(s)
    words=len(s.split())
    lines=s.count('\n')    print lines,words,chars
Traceback (most recent call last):
  File "G:/py/pytest33/test123.py", line 20, in <module>
    wordCount(s)
NameError: name 'wordCount' is not defined


预定义函数
可以直接使用

自定义函数
用户自己编写


函数的定义和调用
//定义
def 函数名([参数列表]): 
函数名:如果由多个单词组成,第二个单词的首字母应该大写   

//调用
函数名([参数列表])
     
#!/usr/bin/python

def 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()

最好这样写if type(int(num)) == type(1)
type返回的不是字符串,是type对象。

 

 

函数名赋值给变量
int2give = int
print int2give('3')


------------------------------------------
函数参数

形式参数和实际参数
- 在定义函数时,函数名后面括号中的变量名称叫做“形式参数”,或者称为“形参”
- 在调用函数时,函数名后面括号中的变量名称叫做“实际参数”,或者称为“实参”

形参和实参一定要一一对应

def connect(host,port)

a=sum(127.0.0.7,3306)  127.0.0.1对应host,3306对应port,不能够a=connect(3306,127.0.01)

或者指定参数

fun(1,2)
fun(x=1,y=2) 传参的另一种方式,指定参数,不过很少用
fun(1)





in的用法
if  i  in '0123456789'
if  plus_one in  range(10)


sys.argv跟shell内置变量一样
sys.argv[0] 相当于 $0表示脚本本身
sys.argv[1] 相当于 $1 第一个参数
sys.argv[2] 相当于 $2 第二个参数
sys.argv     返回所有参数列表['memory.py', '2', 'uu']
len(sys.argv)   参数的个数

 


#!/usr/bin/python
import sys
import os

def isNum(s):
    for i in s:
        if i in '0123456789':
            pass
        else:
            #print "%s is not a number" %s
            break
    else:
        print s


isNum(sys.argv[1])


----------------------------------

 

练习
打印系统的所有PID
要求从/proc读取。
os.listdir()
os.listdir:列出目录下的所有文件和目录,列表形式,每个列表元素都是字符串

复制代码

打印系统的所有PID
要求从/proc读取。
os.listdir()
os.listdir:列出目录下的所有文件和目录,列表形式,每个列表元素都是字符串#!/usr/bin/env python# -*- coding:utf-8 -*-# __author__="huazai""""pycharm 使用指南
Date:2016.08.12"""import osimport sysimport stringdef isNum(s):    for i in s:        if i in '0123456789':            pass
        else:                # print "%s is not a number" %s
            break
    else:        print sfor i in os.listdir('/proc'):
    isNum(i)

    
或#!/usr/bin/env python# -*- coding:utf-8 -*-# __author__="huazai""""pycharm 使用指南
Date:2016.08.12"""import osimport sysimport stringdef isNum(s):    if s in '0123456789':        print sfor i in os.listdir('/proc'):
    isNum(i)

 

----------------------------------------------------------

函数默认参数
缺省参数(默认参数)
def fun(x, y=100):
print x,y
默认参数只能写在最右边,否则会报错 def fun(y=100,x): 这个报错


---------------------------------------------------------
函数里的变量
局部变量和全局变量
- Python中的任何变量都有特定的作用域
- 在函数中定义的变量一般只能在该函数内部使用,这些只能在程序的特定部分使用的变量我们称之为局部变量
- 在一个文件顶部定义的变量可以供文件中的任何函数调用,这些可以为整个程序所使用的变量称为全局变量

global语句
global 变量名
强制声明为全局变量

全局变量在函数外声明,在函数里面global引用全局变量
在函数里面global声明全局变量,在函数外可以引用这个全局变量

#!/usr/bin/env python# -*- coding:utf-8 -*-# __author__="huazai""""pycharm 使用指南
Date:2016.08.12"""import osimport sysimport string

x = 100def fun():    global x
    x += 1    print x

fun()print x

 

 


globals函数打印当前环境的所有全局变量,返回字典
locals函数打印当前环境的所有局部变量,返回字典

#!/usr/bin/env python# -*- coding:utf-8 -*-# __author__="huazai""""pycharm 使用指南
Date:2016.08.12"""import osimport sysimport string





x = 100def fun():
    x = 1
    y = 1    print locals()



fun()print globals()


-------------------------------------------------------

函数返回值
- 函数被调用后会返回一个指定的值
- 函数调用后默认返回None
- return 返回值
- 返回值可以是任意类型
- return执行后,函数终止
- return与print区别


------------------------------
多类型传值

元组传参
形参前面加一个* 传入元组,元组要放在右边

至少要3个参数,如果只传入元组,里面元组一定至少要有3个元素,填充形参x,y,zdef fun(x, y, *z):    print x    print y    print z    print  x+y+z[0]    


if __name__ == '__main__':
    t1 = (1,2,3,4)
    t = (1,2,3)
    fun(*t1)
    返回:1  2  (3, 4)   6
    fun(*(1, 2, 3))
    返回: 1  2   (3,)  6
    fun(1, *t)
    返回: 1  1  (2,3)   4


 

字典传参
字典的key的名字要跟形参的名字一样,x,y,z否则会报错


跟元组传参一样,至少要3个参数,如果只传入字典,字典里面一定至少要有3个元素,填充形参x,y,zdef fun(x,y,z,**args):    print x+y+z    print argsif __name__ == '__main__':
    dic = {'x': 1, 'y': 3, 'z': 5,'a':6}   # 字典的key必须要加引号,否则报错
    fun(**dic)
    返回:    9{'a': 6}def fun(x,y,z,**args):    print x+y+z    print argsif __name__ == '__main__':
    fun(x=1,y=2,z=3,a=6)
    返回:    6{'a': 6}def fun(x,y,z,**args):    print x+y+z    print argsif __name__ == '__main__':
    dic = {'a': 1, 'b': 3, 'c': 5,'c':6}   # 字典的key必须要加引号,否则报错
    fun(1,2,3,**dic)


    注意:    def fun(x,y,z,**args):    print x+y+z    print argsif __name__ == '__main__':
    dic = {'x': 1, 'y': 3, 'z': 5,'a':6}   # 字典的key必须要加引号,否则报错
    fun(1,2,3,**dic)
注意:输入了默认参数,那么字典的key就不能跟参数一样,不能用x,y,z,否则会报错
Traceback (most recent call last):
  File "C:/Users/Administrator/Desktop/Գ��python�༶5��/python��ϰ/aa.py", line 23, in <module>
    fun(1,2,3,**dic)
TypeError: fun() got multiple values for keyword argument 'y'


 

 

冗余参数
向函数传元组和字典
处理多余实参

def fun(x,y,*args,**kwargs)


fun(1,2,'a',[2,4],y=2,z=3)
fun(1,2,'a',[2,4],*t,y=2,**{'u':12})

 


--------------------------------
函数递归调用

计算阶层
递归调用
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)

print factorial(5)


注意事项
必须有最后的默认结果: if n == 0
递归参数必须向默认结果收敛的: factorial(n-1)

 

打印目录下所有文件

#!/usr/bin/env python# -*- coding:utf-8 -*-# __author__="huazai""""pycharm 使用指南
Date:2016.08.12"""import osimport sysimport stringdef print_files(path):    # isdir, isfile, join = os.path.isdir, os.path.isfile, os.path.join
    # print isdir,isfile,join

    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 dirs:        for d in dirs:
            print_files(os.path.join(path, d))    if files:        for f in files:            print os.path.join(path, f)


print_files(sys.argv[1])

把函数名赋值给变量# isdir, isfile, join = os.path.isdir, os.path.isfile, os.path.join# print isdir,isfile,join


 

---------------------------------------------------------------------------

匿名函数
lambda函数是一种快速定义单行的最小函数,可以用在任何需要函数的地方。
lambda语句中,冒号前是参数,可以有多个,逗号隔开,冒号右边是返回值。
lambda语句构建的其实是一个函数对象

def fun(x, y):
return x*y
fun(2, 3)
r = lambda x,y: x*y
r(2, 3)

def add(x, y):
return x + y
sum = reduce(add, [1, 2, 3])

reduce(lambda x,y:x+y, range(1,4))

 

匿名函数优点:
- 1.使用python写一些脚本时,使用lambda可以省去定义函数的过程,让代码更加精简。
- 2. 对于一些抽象的,不会被别的地方再重复使用的函数,有时候函数起个名字也是个难题,使用lambda不需要考虑命名的问题。
- 3. 使用lambda在某些时候让代码更容易理解。

 

-------------------------------------------

内置函数

所有内置函数和内置类都在__builtin__模块(__builtin__前后双下划线)
查询内置函数和类
https://docs.python.org/2/library/index.html


绝对值,最大最小值
abs()
max()
max('12345','789')
字符串'789‘比字符串’12345‘大,字符串是从左到到右开始比较的,'7’比‘1'大,所以输出’789'
min()

len() 参数是一个对象(字符串,元组,字典)不能是整数
divmod() 参数是两个数字,返回商和余数
pow() 乘方
round() 给出小数点的精度,没有第二个参数直接四舍五入,round(12.367,3)保留三位小数

先进行四舍五入的运算,如果小数点精度最后一位是偶数复合条件,如果小数点精度的最后一位四舍五入是奇数,则舍弃原小数点精度后的所有数字,以及保证
小数点精度最后一位必须是偶数

 

常用函数
callable() 可被调用的,例如类,函数
type()
isinstance() isinstance(s,(int,tuple,str)),s是一个对象,第二个参数是元组,判断s这个对象的数据类型在不在第二个参数元组里,是返回true ,否返回false

class A(object):    passa=A()print isinstance(a,A)

 

cmp() 如果是字符串,则逐个字符比较,一旦有字符比较出来就不往下比较
range()
xrange()

类型转换函数
int() 参数如果是字符串,只能是纯数字字符串,不能带小数
long() 参数如果是字符串,只能是纯数字字符串,不能带小数
float() 参数如果是字符串,只能是纯数字字符串,不能带小数
complex()
str()
list()
tuple()
hex()
oct()
chr() 输入0<x<256 返回ascii字符
ord() 输入ascii的单个字母,返回数字
eval() 将有效表达式求值,其实就是去掉字符串

 

 

字符串处理函数
下面函数实例化一个string对象或声明一个string变量
str.capitalize()   将字符串里的第一个字符大写并返回
str.replace()   replace(old,new,count)
str.split()   字符串切成列表 不指定分隔符,那么默认以空格,tab键,换行符作为分隔 split('.',1) 点为分隔,切1次
str.join()     列表连接为字符串 ''.join([str(i)  for i in range(10)])  join会在被插入字符中间插入 ','.join([str(i)  for i in range(10)]) 逗号变为的分隔符
s= 'sdf'
s.join('22')
'2sdf2'

静态函数,不需要实例化一个string对象
string模块   import  string
string.capitalize('hello')
string.replace('wecan','a','t')
string.split('we,w,e',',')
string.join('ww','tt')



序列处理函数
len()
max()
min()
filter()   filter(none/func, seq) 如果不是none,func这个函数依次对sequence里的元素做处理,最后返回一个list, tuple, or string。

 

zip() 合并多个列表、元组
l1=[1,2,3]
l2=['a','b','c']

zip(l1,l2)
[(1, 'a'), (2, 'b'), (3, 'c')]
dict(zip(l1,l2)) 从中创建字典

l1=(1,2,3)
l2=['a','b','c']
print zip(l1,l2)
[(1, 'a'), (2, 'b'), (3, 'c')]

 


高阶函数
map()函数,第一个参数为自定义函数,第二个参数为一个可迭代对象(元组,列表),返回一个列表
def f2(x):
return x*x

if __name__ == '__main__':
lt = (1, 2, 3, 4, 5)
m1 = map(f2, lt)
print(type(m1))
print (m1)
# <type 'list'>
# [1, 4, 9, 16, 25]

 

reduce()函数
把可迭代对象的前两个参数作为函数的实参,传入到f函数中
把每次f运算的结果作为第一个实参,可迭代对象的下一个元素作为另一个实参,传入函数f中
以此类推,最终得到结果
def f2(x,y):
return x*y

if __name__ == '__main__':
m1 = reduce(f2,[1,2,3],10)
print(type(m1))
print (m1)

<type 'int'>
60

 

filter()函数
每次把可迭代对象的元素传入进去,进行处理,返回可以迭代对象的类型,比如可迭代对象是列表那么就返回列表,可迭代对象是元组那么就返回元组

def is_odd(x):
return x%2==1

if __name__ == '__main__':
a = [1,2]
print (filter(is_odd,a))
[1]

 



map()   map(none/func,l1,l2,l3)跟zip函数一样,元素最少的那个序列以none补充,map(func,seq)对序列的每个元素都放进去函数里去处理,并且函数参数要与序列元素个数相同
与filter(func, seq)类似,但是filter(func, seq)只能处理单个序列

reduce() 函数,  reduce(func,seq)

使用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)]

[i for i in range(10) if i%3 == 0]




提示

16行报错,vim +16 xx.py

 


 

函数的参数不能是连字符

def f(x, **kwargs):
print x
print kwargs


f(1,a=10,b-b=20) 报错 涉及变量的命名
f(1,a=10,b_b=20) 正确




变量的命名
- 变量名由字母、数字、下划线组成。
- 变量不能以数字开头
- 不可以使用关键字


In [1]: def f(x, **kwargs):
...: print x
...: print kwargs
...: f(1,a=10,b-b=20)
File "<ipython-input-1-35f95bb06c84>", line 4
f(1,a=10,b-b=20)
SyntaxError: keyword can't be an expression

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP