十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
1、定义函数
成都创新互联作为成都网站建设公司,专注网站建设公司、网站设计,有关成都企业网站定制方案、改版、费用等问题,行业涉及广告推广等多个领域,已为上千家企业服务,得到了客户的尊重与认可。
函数是可重用的程序。本书中已经使用了许多内建函数,如len()函数和range()函数,但是还没自定义过函数。定义函数的语法格式如下:
def 函数名(参数):
函数体
定义函数的规则如下:
①关键字def用来定义一个函数,它是define的缩写。
②函数名是函数的唯一标识,函数名的命名规则遵循标识符的命名规则。
③函数名后面一定要紧跟着一个括号,括号内的参数是可选的,括号后面要有冒号。
④函数体(statement)为一个或一组Python语句,注意要有缩进。
⑤函数体的第一行可以有文档字符串,用于描述函数的功能,用三引号括起来。
按照定义规则,可以定义第一个函数了:
def hello_world():
... print('Hello,world!') # 注意函数体要有缩进
...
hello_world()
Hello,world!
这个函数不带任何参数,它的功能是打印出“Hello,world!”。最后一行代码hello_world()是调用函数,即让Python执行函数的代码。
2、全局变量和局部变量
全局变量是定义在所有函数外的变量。例如,定义一个全局变量a,分别在函数test1()和test2()使用变量a:
a = 100 # 全局变量
def test1():
... print(a)
...
def test2():
... print(a)
...
test1()
100
test2()
100
定义了全局变量a之后,在函数test1()和test2()内都可以使用变量a,由此可知,全局变量的作用范围是全局。
局部变量是在函数内定义的变量,除了用关键字global修饰的变量以外。例如,在函数test1()内定义一个局部变量a,分别在函数外和另一个函数test2()内使用变量a:
def test1():
... a = 100 # 局部变量
... print(a)
...
def test2():
... print(a)
...
test1()
100
print(a)
Traceback (most recent call last):
File "stdin", line 1, in module
NameError: name 'a' is not defined
test2()
Traceback (most recent call last):
File "stdin", line 1, in module
File "stdin", line 2, in test2
NameError: name 'a' is not defined
Python解释器提示出错了。由于局部变量a定义在函数test1()内,因此,在函数test1()内可以使用变量a,但是在函数外或者另一个函数test2()内使用变量a,都会报错,由此可见,局部变量的作用范围是定义它的函数内部。
一般情况下,在函数内声明的变量都是局部变量,但是采用关键字global修饰的变量却是全局变量:
def test1():
... global a # 全局变量
... a = 100
... print(a)
...
def test2():
... print(a)
...
test1()
100
print(a)
100
test2()
100
这个程序与上个程序相比,只是在函数test1()中多了一行代码“global a”,程序便可以正确运行了。在函数test1()中,采用关键字global修饰了变量a之后,变量a就变成了全局变量,不仅可以在该函数内使用,还可以在函数外或者其他函数内使用。
如果在某个函数内局部变量与全局变量同名,那么在该函数中局部变量会覆盖全局变量:
a = 100 # 全局变量
def test1():
... a = 200 # 同名局部变量
... print(a)
...
def test2():
... print(a)
...
test1()
200
test2()
100
由于在函数test1()中定义了一个与全局变量同名的局部变量a,因此,在函数test1()中全局变量a的值被局部变量覆盖了,但是在函数test2()中全局变量a的值没有被覆盖。
综上所述,在Python中,全局变量保存的数据供整个脚本文件使用;而局部变量只用于临时保存数据,变量仅供局部代码块使用。
按照您的code,代码是无法编译的,简单的例证见图片。
另外,您的代码是不是应该这样:
def interval(start,stop=None,step=1):
if stop is None:
start,stop=0,start
step=1
print start,' ',stop,' ',step
调用的时interval(10)
结果是 0 10 1
是因为start,stop = 0, start 这一句, 把0赋给start, start的值赋给stop
编程的目的就是为了处理信息,信息则是由各种不同类型的数据表示的,对数据的进一步处理也会使信息更加丰富和有效。
5.1变量
前面已经提到过“变量”这属语,下面再进一步解释一下。
在程序运行时,必须把数据导入计算机的存储单元中,但存储单元的命名是用二进制数表示的,晦涩难懂。为了方便起见,可以给存储单元起上一个通俗易懂的名字,即 变量名 。
变量的生命周期和程序的运行周期是相同的,一个程序运行解释,所占用的存储空间也就随之释放,用变量名表示的数据所占用的这个存储单元也就空闲了。
变量名的命名规则:
由字母、数字、下划线构成,必须由字母开头。
不能包含-、*、?、#、、;、/、、@、%、$、空格等特殊字符。
最好使用有含义的英文单词或汉语拼音。
最好采用小写字母。
不能使用保留字(已被Python语言系统本身赋予特定意义的单词)。Python的保留字如下表所示。
Python保留字列表
Python是区分大小写的,虽然可以将一个英文单词通过字母大小写不同而作为不同变量的变量名,但从程序可读性的角度看,的确不可取。
Python是一种动态类型的语言,变量的类型由变量的值决定。换而言之,给变量赋何种类型的值,变量就是该值的类型。给变量赋值可以通过赋值号(=)来实现。如:
myvar=100
type(myvar)
myvar='tom'
type(myvar)
在这个例子中,变量myvar首先赋值为100,显而易见,100是个整数,通过type()这个函数检测,变量myvar的类型为整数类型(int);接下来变量myvar赋值为‘tom’,通过type()这个函数检测,变量myvar的类型改变为字符串类型(str)。
不仅可以给一个变量赋值为常量,也可以赋值为另一个变量。如:
a=100
b=a
b
100
在这个例子中,“b=a”的实际意义是,变量b和变量a指向同一个存储单元,既然是同一个存储单元,变量b和变量a本质上就是完全相同的,这就好比一个人除了本名之外,还有其他的名字,如笔名、昵称、乳名等等,虽然本质一样,但是可以在不同场合使用。
5.2关于Python的常量问题
在大多数语言中都有常量这个概念,但是Python却没有。其实仔细想想也好像没有设置常量的必要,只要一个变量的值不发生变化,即不给变量重新赋值,它的值当然不会变化,它便是个常量。
5.3基本数据类型
5.3.1整数型和浮点数
整数型(integer),可以是正整数、负整数和0,可以是十进制、八进制、二进制等。
浮点数(float),由整数部分和小数部分组成,主要用于处理包括小数的数。浮点数也可以用科学计数法表示。
5.3.2 字符串类型
字符串类型是由一系列的字母或者其他符号组成的数据序列,通常用单引号、双引号或三引号括起来。
用单引号和双引号括起来的字符串只能放在同一行,用三引号括起来的字符串可以分布在连续多行上。如:
name='我的名字叫王小明'
old="今年6岁"
introduce='''我想说: 我是中国娃
爱讲普通话
要学习写标准的汉字'''
print(name)
print(old)
print(introduce)
运行结果为:我的名字叫王小明
今年6岁
我想说: 我是中国娃
爱讲普通话
要学习写标准的汉字
不管是哪一种引号形式,括起来的部分是一个整体,包括空格和换行符都属于字符串的一部分。
为了保证特殊的输出效果,Python中的字符串支持转义字符,可使用反斜杠“”对一些特殊字符进行转义。常用的转义字符如下:
续行符
换行符
空
水平制表符
” 双引号
’ 单引号
一个反斜杠
f 换页
其中,续行符(“”)用于当一个字符串在一行写不下时用续行符进行连接,但通常更多的采用小括号“()”即可。
如:
第一种方法采用续行符(“”):
str="A thousand wishes, a thousand plans and
a thousand resolutions are better than one action!"
print(str)
A thousand wishes, a thousand plans and a thousand resolutions are better than one action!
第二种方法采用小括号():
str=("A thousand wishes, a thousand plans and "
"a thousand resolutions are better than one action!")
print(str)
A thousand wishes, a thousand plans and a thousand resolutions are better than one action!
下面举例说明换行符(“ ”)的用法:
str=" 登鹳雀楼 白日依山尽, 黄河入海流。 欲穷千里目, 更上一层楼。 "
print(str)
登鹳雀楼
白日依山尽,
黄河入海流。
欲穷千里目,
更上一层楼。
下面举例说明使用转义字符输出双引号(“)的方法:
str="王之涣的诗《登鹳雀楼》中这样写道:" 白日依山尽,黄河入海流。欲穷千里目,更上一层楼。""
print(str)
王之涣的诗《登鹳雀楼》中这样写道:" 白日依山尽,黄河入海流。欲穷千里目,更上一层楼。"
5.3.3布尔类型
布尔类型用来表示逻辑值,所谓逻辑判断的结果,不外乎“真”或“假”两种情况。在Python中“真”用True表示,“假”用False表示。如果布尔类型的变量参与算数运算,则True被当作1,False被当作0。
如:
result=True
print(result)
True
print(result+1)
2
result=False
print(result)
False
print(result+1)
1
5.3.4类型强制转换
Python是一种弱数据类型语言,可以通过给变量重新赋值的方法改变数据类型。但有时为了强制改变数据类型,就要使用类型转换函数来改变。
譬如,为了从键盘读入成绩的数据,可以用float()函数将input()语句读入的字符串转换为浮点数,再赋值给变量score。
score=input("请输入您的成绩:")
请输入您的成绩:96.5 (从键盘输入96.5)
为了计算成绩比及格线高了多少分,使用下面的命令,发现出现了错误提示如下:
score-60
Traceback (most recent call last):
File " ", line 1, in
score-60
TypeError: unsupported operand type(s) for -: 'str' and 'int'
这是属于类型错误,原因是从键盘读入的成绩值(96.5)并非数值类型,不能参与算数运算。用type()函数可以进一步查询变量score的数据类型。
type(score)
使用float()函数进行强制转换后,就可以解决上述问题:
score=float(input("请输入您的成绩:"))
请输入您的成绩:96.5
score=float(score)
type(score)
score-60
36.5
下表列举了一些常用的类型转换函数:
Python内置函数有很多,为大家推荐5个神仙级的内置函数:
(1)Lambda函数
用于创建匿名函数,即没有名称的函数。它只是一个表达式,函数体比def简单很多。当我们需要创建一个函数来执行单个操作并且可以在一行中编写时,就可以用到匿名函数了。
Lamdba的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
利用Lamdba函数,往往可以将代码简化许多。
(2)Map函数
会将一个函数映射到一个输入列表的所有元素上,比如我们先创建了一个函数来返回一个大写的输入单词,然后将此函数应有到列表colors中的所有元素。
我们还可以使用匿名函数lamdba来配合map函数,这样可以更加精简。
(3)Reduce函数
当需要对一个列表进行一些计算并返回结果时,reduce()是个非常有用的函数。举个例子,当需要计算一个整数列表所有元素的乘积时,即可使用reduce函数实现。
它与函数的最大的区别就是,reduce()里的映射函数(function)接收两个参数,而map接收一个参数。
(4)enumerate函数
用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环当中。
它的两个参数,一个是序列、迭代器或其他支持迭代对象;另一个是下标起始位置,默认情况从0开始,也可以自定义计数器的起始编号。
(5)Zip函数
用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
当我们使用zip()函数时,如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同。