python中的函数,以及函数的可变参数,递归函数和高阶函数以及练习题目

函数作用: 实现代码的复用
函数概念:函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。
函数能提高应用的模块性,和代码的重复利用率。你已经知道Python提供了许多内建函数,比如print()。但你也可以自己创建函数,这被叫做用户自定义函数。
系统的几个内建函数:现成的函数,不需要定义def
# 1、绝对值:abs(-1)
# 2、最大最小值:max([1,2,3])、min([1,2,3]),对序列进行操作
# 3、序列长度:len('abc')、len([1,2,3])、len((1,2,3))
# 4、乘方:pow(2,3,4) // (2**3) % 4

# 5、浮点数:round(3.1415926, 2) //3.14 四舍五入 ,比较重要,

f=11.0/3
print round(f,3)  #科学的四舍五入
返回:3.667# 6、类型转换函数:int()、str()....
# 7、比较函数cmp()
还有一个重要的函数:匿名函数,lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。 

def func(x,y):

return x+y
func = lambda x,y:x+y  #上面这个函数就可以直接用lambda函数写出来,是两个等价的函数
创建函数语法
def 函数名(参数列表):
函数语句/函数体

函数的命名规则:驼峰命名:每个单词首字母要大写

小驼峰命名规则,一个单词直接小写   # 多个单词,每个单词小写,以下划线分隔 ge_student_name

大驼峰:单词首字母大写

类名,文件名,首字母大写,每个单词首字母大写

方法名:首字母小写,每个单词首字母大写 ,中间可能会加下划线

文档化说明的函数注意:函数首行加 ''  或 ''' '''使用函数名.__doc__属性 可以查看函数文档

def sum():
    '''
这是第一个函数
    '''
    pass                            ####pass是用来占位的

print sum.__doc__  #内置变量,双下划线,内置的固定参数,输出函数说明

输出函数说明: 这是第一个函数help(函数名),例子:


callable(函数名) --判断函数是否可以被调用:debug的时候经常报错,xx is not callable --说明你应该在报错的地方给一个函数,结果你给的xxx不能当函数用

判断a=0,是否是函数

a=0
print callable(a)

返回结果:False

例子:因为key后面要加一个函数,但是a不是函数,所以就会报错,截图错误,就表示a不能当函数用

dic=[1,2,3]
a=0
print sorted(dic,key=a)

控制台输出:

函数的参数:参数可以指定参数名,也可以不指定参数名,下面是两个例子:

#不指定参数名
def my_function(a,b):
    print a+b
my_function(1,2)
#可以指定参数名
def my_function(name,age):
    print '姓名:%s,年龄:%s'%(name,age)
my_function(name='zhangsan',age=12)

默认参数的使用 

  *顺序:带默认值的参数往后放,后面不能再有必填参数,带有默认值的参数后面一定不能再有参数了

def function(age=6,name):   #后面不能再有必填参数的,这种写法就是错误的
    print name,age
function(6,'zhangsan')
function('zhangsan')

*初始化逻辑:默认值最好是不可变数据类型:如果是不可变数据类型,默认为空最好用None,别用[],因为第第一次赋值的值,会一直记录

def extendList(val, list=[]):
    list.append(val)
    return list
list1 = extendList(10)
list2 = extendList(123, [])
list3 = extendList('a')
print "list1 = %s" % list1
print "list2 = %s" % list2
print "list3 = %s" % list3

结果:

list1 = [10, 'a']
list2 = [123]
list3 = [10, 'a']

例子:直接给age指定了年龄18

#使用默认值
def my_function2(name,age=18):
    print '姓名:%s,年龄:%s'%(name,age)
my_function2('zhangsan')

可变参数:传递参数的个数是可变的,参数是不定的,在参数后面加 * ,表示后面有若干个参数,当元祖来处理的      语法:def checkin(name, id, *other):  other  函数是是当元组来处理的

def checkin(name, id, *other):
    print '姓名:%s, 工号:%s, 其他信息:%s' % (name, id, other)
#
checkin('梁水', '12341', 1231231232, '山西省太原市','water')

也支持多个*号,两个*的不可变数据类型,在函数内部是当字典来处理的 ,选填参数

def checkin2(name, id, **other):
    print '姓名:%s, 工号:%s, 其他信息:%s' % (name, id, other)

checkin2('water', '1234', phone = 13800000000, address = '北京哇哈哈')

**参数定义的顺序必须是:必选参数、默认参数、可变参数(name,age=6,**other)

函数的作用域的问题


关于函数返回的几种理解: return的优先级高于一切


见到return 函数就结束

举例说明:

def a():
    print '能打印吗?'
    return 0,1
print a()    
#结果就是: 能打印吗?
            (0, 1)
 
 

下面这种:

def a():
    return 0, 1
    print '能打印吗?'

print a()

#结果就是 (0, 1)

不写return无返回--None

只写return 返回None

def my_function2(name):
    print '姓名:%s,' % (name)
    return 
print my_function2('beijing')   #返回 None

return里面有多个值--实际返回的是元祖,如图

def my_function2(name):
    print '姓名:%s,' % (name)
    return 1,2,4,5,6
print my_function2('beijing')       #执行结果:姓名:beijing,     (1, 2, 4, 5, 6)

递归:函数自己调自己,如果一个函数在内部调用自身,这个函数叫做递归函数,递归调用的次数过多,会导致栈溢出 :要慎重

def a():
    print 'a'
    a()

a()

递归函数的两个练习:回声练习和阶乘

1.求一个数n的阶乘

def fact(n):
    if n == 1:
        return 1
    return n * fact(n - 1)

print fact(5)
2.编写一个递归函数,达到回声的效果
比如:同志们你们好吗
输出:同志们你们好吗 志们你们好吗 们你们好吗 你们好吗 们好吗 好吗 吗

def fact_voice(context):
    if len(context) == 0:
        return 0
    print context,
    context = context[1:]
    return fact_voice(context)

fact_voice(u'同志们你们好吗')

高阶函数:可以理解为函数套函数,函数的参数里面也带一个函数,最基本的几个高阶函数的应用,函数的参数是函数

map():函数接收两个参数,一个是函数,一个是序列,将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回
应用:并行遍历--序列合并

a = [1, 2, 3, 4, 5]
print map(lambda x:x**2,a)  #序列的每一项都2次方
reduce():把一个函数作用在一个序列上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
a = [1, 2, 3, 4, 5]
print reduce(lambda x,y:x*y,a)   #求乘积
filter():“筛选”函数
·和一个序列

把传入的函数依次作用于每个元素,根据返回值是True还是False决定保留还是丢弃该元素

a = [1, 2, 3, 4, 5]
print filter(lambda x:x%2==0,a)  #筛选偶数
"""1.利用map()函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。
输入:['adam', 'LISA', 'barT'],输出:['Adam', 'Lisa', 'Bart']"""
data = ['adam', 'LISA', 'barT']

print map(lambda x:x.capitalize(), data)
 
 

下面这个函数是自己刚开始学习不太懂,老公给我出的一个题目,哈哈哈哈,让我明白了函数与函数之间的调用:

# 题目# 想和史华涛结婚, 他必须满足几个条件, 如果满足 (每个条件就是一个函数), 输出结婚的时间# 1. 必须在24-27 之间# 2. 必须爱我

# 3. 必须有money,

哈哈,竟然暴露了自己的结婚日期

def andShtsGetMarry(age,islove,ismoney):
    if isageok(age) and isloveme(islove) and hasmoney(ismoney):
        return '2016-12-24'
    else:
        return ''

def isageok(age):
    if age in [24,25,26,27]:
        return True
    else:
        return False


def isloveme(love):
    if love=='love':
        return True
    else:
        return False


def hasmoney(money):
    if money>10000:
        return True
    else:
        return False

print andShtsGetMarry(27,'love',1000000000)

练习题二:#双11要采购一些生活用品,但是money有限,只有200元,
#牛奶 20元 面包 2元 苹果5块 衣服 50 鞋子70 菜10元 零食22 饮料8 水7块 羽毛球 60

#1:随便输入几件自己喜欢的,输出购买商品和剩余的money

goodlist=[{'goodsname':'milk','goodsprice':20},
{'goodsname':'bread','goodsprice':2},
{'goodsname':'apple','goodsprice':5},
{'goodsname':'clothers','goodsprice':50},
{'goodsname':'apple','goodsprice':70},
{'goodsname':'vegetable','goodsprice':10},
{'goodsname':'drunkfood','goodsprice':22},
{'goodsname':'drink','goodsprice':8},
{'goodsname':'water','goodsprice':7},
{'goodsname':'ball','goodsprice':60}]
restmonye=200
#判断输入的商品名称是否存在商品列表里面
def isExitGoodslist(goodsname):
    for i in goodlist:
        if goodsname == i.values()[0]:
            return True
    return False

#判断剩余余额是否能购买此商品
def isenoughmoney(goodsname):
    global restmonye
    for i in goodlist:
        if goodsname == i.values()[0]:
            price = i['goodsprice']
    if restmonye>= price:
        restmonye-=price
        return True,price
    else:
        return False,0

def manygoods():
    goods=raw_input('请输入你要购买的商品:')
    if isExitGoodslist(goods):#判断商品存在
        if isenoughmoney(goods)[0]: #判断是否可以购买
            print goods,restmonye
            return manygoods()
        else:
            return '钱不够了'
    else:
        print '商品不存在'
        return manygoods()
# print manygoods()

#2:看看最多能买多少件,剩下多少钱
#3:最少能买多少件,剩下多少钱

学到了知识点:

1:如果要在函数里面修改全局变量,就需要在函数里面添加global修饰,即 global 全局变量名

2:return 后面加函数名,表示结束本次并且调用新的函数

3:字典是无序,所以使用要注意索引方式取值可能会混乱,要通过key来取值

猜你喜欢

转载自blog.csdn.net/xxlovesht/article/details/80489001