3-Python 函数(2)

本章概要:
  1、函数基础
  2、深入理解函数
  3、综合练习


1、函数基础

</br>课程概要:
  理解函数
  定义函数
  调用函数
  函数文档

一、理解函数

函数这个数学名词是莱布尼茨在1694年开始使用的。

二、定义函数

1、Python 函数格式

def 函数名(参数1, 参数2,  ..., 参数n):
    函数体(语句块)

2、函数的命名方式

三、调用函数

1、降低编程的难度,通常将一个复杂的大问题分解成一系列更简单的小问题,然后将小问题继续划分成更小的问题,当问题细化足够简单时,就可以分而治之。

2、代码重用

3、return 语句

def add_function(x, y):
    '''
    This is a function that adds x and y
    '''

    return x+y

if __name__=="__main__":
    a=4
    b=9
    c=add_function(a, b)

    print "a+b={0}+{1}={2}".format(a, b, c)
def add_function(x, y):
    '''
    This is a function that adds x and y
    '''

    return x+y

if __name__=="__main__":
    a=4
    b=9
    c=add_function(x=a, y=b)

    print "a+b={0}+{1}={2}".format(a, b, c)
def add_function(x, y):
    '''
    This is a function that adds x and y
    '''

    return x+y

if __name__=="__main__":
    a="py"
    b="thon"
    c=add_function(a, b)

    print "a+b={0}+{1}={2}".format(a, b, c)
# 斐波那契数列
def fibs(n):
    '''
    This is the Fibonacci sequence.
    '''
    result=[0, 1]
    for i in range(n-2):
        result.append(result[-2]+resultp[-1])
    return result

if __name__=="__main__":
    lst=fibs(10)
    print lst
#  返回多个值
def my_fun():
    return 1, 2, 3

b, c, d=my_fun()

四、函数文档

1、程序在大多数情况下是给人看的,只是偶尔被机器执行。

2、使用function.__doc__查看函数文档


2、深入理解函数

课程概要:
  参数和变量
  参数收集和传值
  特殊函数

一、参数和变量

# 函数就是对象
def foo(a, b):
    return a+b

p=foo
print p(4,5)

1、按引用传递参数

# 按引用传递
def foo(a, b):
    return a+b

x, y=3, 4
foo(x, y)

2、全局变量和局部变量

x=2    #  外部变量,但不是全局变量

def foo(a, b):
    x=9    #  局部变量
    print "This x is in the fun:",x
def bar():
    global x    #  全局变量
    x=9
    print "This x is in the fun:",x

3、命名空间

二、函数收集和传值

1、收集方式一:*args

def foo(*args):
# args  接收参数生成的是元组
    print args

foo(1, 2, 3)
def foo(x, *args):
    print "x:",x
    print "args:",args

foo(1, 2, 3)

2、收集方式二:**kargs

def foo(* *kargs):
#  kargs 接收参数生成的是字典
    print kargs
  
foo(a=1, b=2, c=3)
#foo(1, 2, 3) 在这个函数里这样传是错误的
def foo(x, * args, * *kargs):
    print x
    print args
    print kargs

foo(1)
foo(1, 2)
foo(1, 2, 3)
foo(1, 2, 3, name="Li Sn")

3、另一种传值方式

def foo(x, y):
    return x+y

bars= 2, 3
# *bars传进去是元组(2, 3)
foo(*bars)
def book(author, name):
    print "{0} has a book:{1}".format(author, name)

bars={"name":"Learn Python", "author":"Boss"}

4、zip()补充

colors=["red", "green", "blue"]
values=[124, 23, 6, 100]
zip(colors, values)
# 没有匹配的对象的100则会被抛弃
dots=[(1, 2), (3, 4), (5, 6)]
x, y=zip(*dots)
seq= range(1, 10)
zip(* [iter(seq)]*3)

#其实就是下面这个实现功能
x=iter(range(1, 10))
zip(x, x, x)

尝试一下zip(* [iter(seq)]*2),看看结果是什么-。-

三、特殊函数

lambda
  map
  reduce
  filter

1、lambda

def foo(x):
    x+=3
    return x
n=range(10)
s=[i+3 for i in n]
lam=lambda x:x+3
n2=[]
for i in n2:
    n2.append(lam(i))
g=lambda x, y: x+y
g(3,4)

2、map

def foo(x):
    x+=3
    return x

n=range(10)
map(foo, n)
map(lambda x:x+3, n)
lst1=[1, 2, 3, 4, 5]
lst2=[6, 7, 8, 9, 10]

map(lambda x, y: x+y, lst1, lst2)

3、reduce

lst1=[1, 2, 3, 4, 5]
lst2=[6, 7, 8, 9, 10]

reduce(lambda x, y: x+y, lst1, lst2)

4、filter

n=range(-5,5)
filter(lambda x: x>0, n)

3、综合练习

练习1:递归
  练习2:解方程
  练习3:统计考试成绩
  练习4:找素数

一、递归

# 递归

def fib(n):
    '''
    This is Fibonacci by Recursion.
    '''
    if n==0:
        return 0
    elif n==1:
        return 1
    else:
        return fib(n-1)+fib(n-2)

if __name__=="__main__":
    f=fib(10)
    print f

二、解方程

# 解方程

from __future__ import division
import math

def quadratic_equation(a, b, c):
    delta= b*b-4*a*c
    if delta < 0:
        return False
    elif delta==0:
        return -(b/(2*a))
    else:
        sqrt_delta= math.sqrt(delta)
        x1=(-b + sqrt_delta)/(2*a)
        x2=(-b - sqrt_delta)/(2*a)
        return x1, x2

if __name__=="__main__":
    print "a quadratic equation: x^2 + 2x + 1=0"
    coefficients=(1, 2, 1)
    roots= quadratic_equation(*coefficients)
    if roots:
        print "the result is : ", roots
    else:
        print "this equation has no solution."

三、统计考试成绩

# 统计考试成绩

from __future__ import division

def average_score(scores):
    '''
    统计平均分
    '''
    score_values=scores.values()
    sum_scores=sum(score_values)
    average=sum_scores/len(score_values)
    return average

def sorted_score(scores):
    '''
    对成绩从高到低排序
    '''
    score_lst=[(scores[k], k) for k in scores]
    sort_lst=sorted(score_lst, reverse=True)
    return [(i[1], i[0]) for i in sort_lst]

def max_score(scores):
    '''
    成绩最高的姓名和分数
    '''
    lst=sorted_score(scores)
    max_score=lst[0][1]
    return [(i[1], i[0]) for i in lst if i[1]==max_score]

def min_score(scores):
    '''
    成绩最低的姓名和分数
    '''
    lst=sorted_score(scores)
    min_score=lst[len(lst)-1][1]
    return [(i[1], i[0]) for i in lst if i[1]==min_score]

if  __name__=="__main__":
    examine_scores={"google":98, "facebook":99, "baidu":52, "alibaba":80,
                    "yahoo":49, "IBM":70, "amazon":99, "apple":99}

    ave=average_score(examine_scores)
    print "the average score is: ", ave

    sor=sorted_score(examine_scores)
    print "list of the scores: ", sor

    xueba =max_score(examine_scores)
    print "Xueba is : ", xueba

    xuezha=min_score(examine_scores)
    print "Xuezha is: ", xuezha

四、找素数

# 找素数

import math

def is_prime(n):
    '''
    判断一个数是否是素数
    '''
    if n <= 1:
        return False
    for i in range(2, int(math.sqrt(n)+1)):
        if n%i ==0:
            return False
        return True

if __name__=="__main__":
    primes= [i for i in range(2, 100) if is_prime(i)]
    print primes

注意当自己写函数时,需要注意的几点:
1、尽量不要使用全局变量
2、参数是可变类型的数据,在函数中千万不要轻易修改它
3、每个函数的目标和功能都要很单纯,不要试图一个函数做很多事情
4、函数的代码函数要少
5、函数的独立性要好

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容