python学习笔记(7)

转载 2015年11月21日 14:54:19

本章介绍如何将语句组织成函数,这样,可以告诉计算机如何做事。

 

下面编写一小段代码计算婓波那契数列(前两个数的和是第三个数)

复制代码
fibs = [0,1]   # 定义一个列表,初始内容是0,1
for i in range(8):  #循环8次
  fibs.append(fibs[-2]+fibs[-1])  #append在末尾追加一个数,这个是它前面两个数的和

#输入
>>> fibs
#输出
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
复制代码

因为赋完值fibs已经有两个数了(01),所以循环8次之后,列表有10个数,两个数相加等于第3个数。

是不是觉得应该由我们输入来控制打印多少个数?只用把程序小变一下就行了。

复制代码
fibs = [0,1]
num = input('How many fibonacci numbers do you want?')
for i in range(num-2):
    fibs.append(fibs[-2]+fibs[-1])
print fibs
#输入
>>> 
How many fibonacci numbers do you want?12
#输出
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
复制代码

 

 

抽象

  抽象有可以节省很多工作,它使得计算机程序可以让人读懂的关键。计算机喜欢处理精确和具体的指令,但人不同,我们更喜欢丢进去一个东西,计算机就能反馈给我们想要的结果,而不是由我们一步一步的告诉它怎么做。因此,上面的代码抽象一点,应该是这样的:

 

num = input('How many fibonacci numbers do you want?')
print fibs

 

那计算机怎么知道要怎么做?我们可以把处理的过程封装成函数,在我们每次用到时只用调用这个函数就可以了。

 

 

创建函数

  函数是可以调用的,它执行某种行为并且返回一个值。内建的callable函数可以用来判断函数是否可调用:

复制代码
>>> import math
>>> x = 1
>>> y = math.sqrt
>>> callable(x)  
False
>>> callable(y)
True
复制代码

备注:callable python3.0中不再可用。

 

那如何定义一个函数呢?使用def语句即可:

复制代码
>>> def hello(name):
    return 'hello.'+name+'!'
#我们定义了一个hello函数,它会将输入的内容前面加“hello.”后面加“!”,并返回给用
#
>>> print hello('world')
hello.world!
>>> print hello('zhangsan')
hello.zhangsan!
复制代码

 

不错吧!再回过头去想想怎样把返回婓波那契数列定义成一个函数。如下:

复制代码
#定义fibs函数,用于婓波那契数列
>>> def fibs(num):
    result = [0,1]
    for i in range(num-2):
        result.append(result[-2]+result[-1])
    return result

#直接调用fibs函数
>>> fibs(10)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
>>> fibs(15)
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
复制代码

 

 

局部变量

  当函数定义生命变量的时候,函数内所生命的变理只在其函数内有效,与函数外具有相同名称的其他变量没有任何关系

复制代码
#局部变量
def func(x):
    print 'x is',x
    x =2    # x=2只在func函数内其作用
    print 'Changed local x to',x
    
x = 50
func(x)   #func函数并没有返回数据过来。
print 'x is still',x

#输出
>>> 
x is 50
Changed local x to 2
x is still 50
复制代码

 

 

global 语句

  如果想把一个变量声名为 全局的,则可以使用global语句。

复制代码
def func():
    global x

    print 'x is',x
    x = 2
    print 'Changed local x to',x

x =50
func()
print 'Value of x is ',x
#输出
x is 50
Changed local x to 2
Value of x is  2
复制代码

global 语句被用来生命是全局,因此在执行完func函数后,x的值已经发生了改变,并且作用于整个程序,因此最后的输入结果为2

 

 

默认参数

  对于一些参数,我们希望它的一些参数是可选的,如果用户不想要为这些参数提供值的话,这些参数就使用默认值。

复制代码
def say(message,times=1):
    print message*times

say('Hello')
say('World',5)
#输出
>>> 
Hello
WorldWorldWorldWorldWorld
复制代码

 

定义的say函数的第两个参数就是可选的,默认为times=1;也就是将两个参数相乘输出。

 

注意:只有在形参表末尾的那些参数可以有默认参数,如def func(a=5,b) 是无效的。

 

 

 

关键参数

  如果某个函数有许多参数,而我们只想指定其中的一部分,那么可以使用名字(关键字)而不是位置来给函数指定实参。----这被称作 关键参数

复制代码
def func(a,b=5,c=10):
    print 'a is',a, 'and b is',b,'and c is',c

func(3,7)
func(24,c=32)
func(c=23,a=14)

#输出
>>> 
a is 3 and b is 7 and c is 10
a is 24 and b is 5 and c is 32
a is 14 and b is 5 and c is 23
复制代码

这样做,我就不必担心参数的顺序,使用函数变得更加简单。假设其它函数都有默认值,我们可以只给自己想要的参数赋值。

 

 

递归:

  有用的递归函数... 等等,什么是无用的递归?先来看一个函数的定义:

def recursion()
    return recursion()

 

显然,它什么也干不了,程序的执行不断申请内存,直接内存耗尽,程序崩溃。

接着,有用的递归函数包含以下几个部分:

  • 当函数直接返回值时有基本实例(最小可能性问题)
  • 递归实例,包括一个或者多个问题最小部分的递归调用。

 

下面通过递归函数来计算一个n的阶,n*(n-1)*(n-2)*....*1

def f(n):
    if n == 1:
       return 1
    else:
        return n*f(n-1)

python 学习笔记7进程和线程

多进程os 系统模块提供了进程的很多东西 os.getpid() 获取进程id pid = os.fork() fork创建一个新的进程 父进程返回子进程id 子进程返回0multiproce...
  • bleuesprit
  • bleuesprit
  • 2016年12月08日 20:23
  • 155

Linux学习笔记(六)——CentOS7初接触

前段时间学习hadoop全分布部署,由于一味求新,我居然安装了centos7,之后才发现变化太大了,耗费了不少时间,如下是用到的几个跟之前版本有变化的地方。 1. centos7设置ip地址 ...
  • thinkpadshi
  • thinkpadshi
  • 2015年06月26日 16:55
  • 1121

Python学习笔记(一)基础语法

Python标识符 在python里,标识符有字母、数字、下划线组成。 在python中,所有标识符可以包括英文、数字以及下划线(_),但不能以数字开头。 python中的标识符是区分大小写的...
  • aa294194253
  • aa294194253
  • 2015年02月15日 10:02
  • 563

Python学习笔记(综述)

python 语言基础教程
  • qq_25612733
  • qq_25612733
  • 2017年01月18日 19:45
  • 261

react native学习笔记7——组件生命周期

每个组件都有自己的生命周期,在其生命周期内,组件经历了初始化-运行-销毁的过程。在运行阶段,每次状态(state)或属性(props)发生变化时,都有对应的组件方法将该变化通知给组件进行渲染刷新(关于...
  • teagreen_red
  • teagreen_red
  • 2017年09月06日 21:21
  • 518

RHCE7 认证学习笔记

学习笔记1— 系统文件目录结构 http://www.linuxidc.com/Linux/2015-02/114225.htm RHCE7认证学习笔记2– 命令行操作文件 ht...
  • u010766726
  • u010766726
  • 2016年08月26日 11:29
  • 1031

斯坦福机器学习笔记七

K均值算法之前说到的算法都是监督学习算法,在监督学习中,训练集都是带标签的,我们的目标是找到能够区分正负样本的决策边界或者根据带标签的数据拟合出假设函数。现在开始介绍非监督学习算法,在非监督学习中,数...
  • a_yangfh
  • a_yangfh
  • 2017年05月04日 09:00
  • 245

Java jdk7学习笔记

l  Jworld@TW技术论坛版主,Java权威技术顾问与专业讲师,Java畅销书作者——林信良全新力作。 l  国内第一本Java 7,前期版本累计销量5万册。 l  《Java JDK 7学...
  • qinghuawenkang
  • qinghuawenkang
  • 2012年04月19日 10:32
  • 6151

python学习笔记 7

这部分主要是关于格式化打印。 比如说 #双引号""和单引号''的意义是一样的,打印字符串时没有区别 print ("We are %s"%"student") print ("We are %s"...
  • shanruo
  • shanruo
  • 2015年08月26日 22:01
  • 95

Python学习笔记(7)

Python学习笔记(7)一、Python的类和面向对象编程先看一个例子:inventory.py文件# The Cellphone class holds data about a cell pho...
  • chszs
  • chszs
  • 2009年01月06日 19:36
  • 1540
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python学习笔记(7)
举报原因:
原因补充:

(最多只允许输入30个字)