python学习(二)函数

创建一个函数

通过def关键字可以创建一个函数

def addNumber(firstNumber,secondNumber) :
    return firstNumber + secondNumber

print "addNumber(2, 3) = "+str(addNumber(2, 3))    #输出: addNumber(2, 3) = 5

另外系统为我们提供了很多函数,我们可以在命令行下通过help()来查看其功能和需要的参数
这里写图片描述

可变参数

def changeArgs(* args):
    sum = 0
    for x in args:
        sum = sum + x;
    return sum

print changeArgs(1,3,6,9)  # 输出: 19

使用元组来返回多个值

在python中,我们可以使用元组来返回多个值

def addAndLess(firstNumber,secondNumber):
    return (firstNumber + secondNumber,firstNumber - secondNumber)

addResult , lessResult = addAndLess(22,11)
print "addResult is :"+str(addResult) + "      lessResult is :"+str(lessResult)   #输出:addResult is :33      lessResult is :11

python中默认的参数

在python中,可以给函数提供一个默认值,如果没有传入参数,则使用该默认的参数

def funDefaultParam(strOne = "hello",strTwo = "world"):
    return strOne + strTwo

print funDefaultParam()  # 输出: helloworld
print funDefaultParam(strTwo="xiaoming") #指定参数对应的是那个型参   输出:helloxiaoming
print funDefaultParam(strOne="nihao",)   # 输出:  nihaoworld

使用global语句改变全局变量的值

#可以使用global语句,在函数体中,改变全局变量的值
number = 22
def changeNumber():
    global number
    number = number + 2
    return number

print "changeNumber():"+str(changeNumber()) # 输出: changeNumber():24

python中的数据类型转换

print int("11")
print float("22")
print bool("1")
print bool("")

这里写图片描述

方法重新命名

另外可以为一个指定的方法重新命名,然后可以直接调用

selfMax = max;
print selfMax(44,77)

python中的迭代和循环

使用range函数来创建个列表,默认的间隔是1

print range(1,10) # [1, 2, 3, 4, 5, 6, 7, 8, 9]

间隔为3,创建一个1-10的列表

print range(1,10,3)  # [1, 4, 7]

for语句迭代循环

在python中,可以使用for语句迭代循环各种对象。包括字符串,列表,字典,和文件

#遍历字符串
a = "get away here"
for x in a :
    print x

#遍历列表
b = ["aaa","bbb","ccc"]
for x in b :
    print x

#遍历字典
c = {
     11 : "one",
     "name" : 22
     }
for x in c :
    print c[x]

python中的异常

在python中和java是一样的,如果程序出现异常,那么可以捕获异常,在python中,可以使用:

try:
    xxxx
except Exception as e:
    print e

这样的形式捕获异常

也可以向java那样,手动抛出异常,在python中使用raise关键字:

raise RuntimeError("raise an exception")

捕获异常

from symbol import except_clause, if_stmt
from locale import str
try:
    file = open("/local/temp/no.txt")
    for line in file:
        print line
except IOError as e:
    print "没有找到文件"

主动抛出异常

def devideMethod(numberOne,numberTwo):
    if numberTwo == 0:
        raise RuntimeError("被除数不能是0")
    else :
        print "the result is :"+str(numberOne / numberTwo)

devideMethod(5,0)

这里写图片描述

python中的对象

在python中使用的所有的值都是对象

通过dir()函数来列出某个对象的所有可用的方法

items = ["aaa","bbb","ccc"]
print dir(items)
"""
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__delslice__', '__doc__', '__eq__', 
'__format__', '__ge__', '__getattribute__', '__getitem__', '__getslice__', '__gt__', '__hash__', '__iadd__',
 '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', 
 '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__setslice__', '__sizeof__', 
 '__str__', '__subclasshook__', 'append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
"""

python创建类

#创建一个具有加法和sayhello功能的类
class MyClass(object):
    def __init__(self,name):
        self.name = name
    def addNumber(self,numberOne,numberTwo):
        print numberOne + numberTwo
    def say(self, sex):
        if sex == "man" :
            print self.name + "先生"
        elif sex == "woman":
            print self.name + "女士"

myClass = MyClass("小明")
myClass.addNumber(22,33)
myClass.say("woman")

这里写图片描述

python静态方法

#在python中也可以写上向java中的静态方法,需要在方法名之前加上@staticmethod这样的关键字
class MyStaticClass(object):
    @staticmethod
    def staticSayHello():
        print "hello world"

MyStaticClass.staticSayHello()

函数的文档

#coding=utf-8
"""
如果模块、类或者函数定义的第一条语句是一个字符串,那么这个字符串就成为了其文档
可以通过这样的方式来查看其文档:

"""
def sayHello():
    """这是方法的文档,用来说明方法的功能"""
    print "hello world..."

print sayHello.__doc__

python中的模块

在python中,同样和java一样,当文件很多的时候,可以将这些文件放入到一个文件夹里边,然后使用import关键字来导入这些文件,为了说明问题,这里我在同一个包下创建两个文件
这里写图片描述

  • add.py
#coding=utf-8

def sayHello():
    print "hello world"

def sayName(realName):
    print "your name is :"+realName
  • userAdd.py
"""
在python中,同样和java一样,当文件很多的时候,可以将这些文件放入到一个文件夹里边,然后使用import关键字来导入这些文件
比如:import add
这是使用add.py文件中的sayHello方法,就可以这样写:
add.sayHello()
"""
add.sayHello()



"""
当然可以为import进来的模块给一个自己喜欢的名字:
import add as jia
"""
jia.sayHello()



"""
如果我只想导入add.py中的sayName方法,可以这样写:
from add import sayName
此时可以直接运行该方法sayName("李四")
"""
sayName("李四")




"""
可以将add.py模块中的所有方法都导入:
from add import *
"""
sayHello()
sayName("张三")

print dir(add)  #['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'sayHello', 'sayName']

列表生成式


# 列表生成式,下面以x变量为基础,生成x * x 作为值
print [x * x for x in range(1,10) if x % 2 == 0]  # 输出: [4, 16, 36, 64]

将函数作为参数

另外其实在python中函数也是变量,因此我们可以将函数也作为参数来传递

def add(x, y, f):
    return f(x) + f(y)

print add(-3,8,abs)

map和reduce

#map接收两个参数,第一个是一个函数,第二个是一个可遍历类型的参数

def addOne(x):
    return x + 1

b = [11,22,33,44]
b = map(addOne, b)
print b  #输出: [12, 23, 34, 45]




#reduce把一个函数作用在一个序列上,这个函数必须是两个参数,reduce把结果继续和序列的下一个元素做累积计算

def addNumber(x,y):
    return x + y;

b = [1,2,3,4]
b = reduce(addNumber,b)
print b

filter函数

filter函数和map函数有点相似,都是将一个函数用作一个序列,但是filter会根据序列中的每一个元素作为该filter的参数,如果返回true,则保留,否则丢弃

#判断一个字符串中是否包含ab字符串
def filterString(str):
    if str.find("ab") != -1:
        return True
    else:
        return False

b = ["abc","adb","ddd","abbb"]
b = filter(filterString,b)
print b  # 输出: ['abc', 'abbb']

sorted函数

#python默认提供sorted函数用于为一个序列进行排序,比如:
print sorted([0,-2,-3,-4,7,9,45])  # 输出: [-4, -3, -2, 0, 7, 9, 45]

#另外sorted()函数还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序
print sorted([0,-2,-3,-4,7,9,45],key=abs)  # 输出:[0, -2, -3, -4, 7, 9, 45]

返回函数

在上面的学习中,发现了,可以将函数作为参数来传递,其实就是变量的传递,这里同样可以将函数作为返回值,比如我们写一个函数,实现元素的二次方

def numberHex(x):
    def realNumberHex():
        return x * x
    return realNumberHex

f = numberHex(3)
print f()   # 输出: 9 

匿名函数

lambda表示匿名函数
# x表示匿名函数的输入参数
b = map(lambda x: x * x, [0,-2,-3,-4,7])
print b  # 输出: [0, 4, 9, 16, 49]    

python装饰器

python装饰器有点类似于java中的spring AOP,android中的hook,即在函数运行时,动态为其增加功能

创建一个装饰器,用来装饰当前函数

def decorSayHello(func):
    def innerSay(name):
        print "before say hello, we need to meet"
        func(name)
        print "after say hello, we need to say bye"
    return innerSay

可以看到,这里在执行传递进来的func函数的时候,在执行之前和执行之后,分别打印了字符串

创建一个函数,使用@测试

@decorSayHello
def sayHello(name):
    print "hello :"+name

sayHello("tset")

decor_first.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值