今天学习函数,不是学习有函数的用法,而是学习关于函数的基础知识
那什么是python中的函数?
python中的函数可以调用来完成相应的命令,就像一个公式可以根据用法以及所需要的参数使用函数后得到的相应的结果。其中python中有内置函数,而我们也可以自定义函数。函数的一个主要目的就是将需要多次执行的代码放在一起。
-
1.导入模块,调用内置函数或者标准库模块使用import
我们常用的print()、input()和len()都属于内置函数,可以直接使用。而标准库模块是包含了相关的函数,比如random()函数可以产生随机数相关的问题,可以直接进行调用。
#导入模块,ipmport+模块random
import random
#使用函数randint()
for i in range(6):
print(random.randint(1,10))
random.randint()函数调用求值为传递给它的两个整数之间的一个随机整数。而randiant是属于random模块的,则就要去到random模块中找到randiant()函数
使用from +模块名称+import*,在后续调用randint时可以不用random.前缀
还可以连续导入不同模块,用逗号将模块隔开
-
2.定义函数,使用def语句
def flower(i):
if i == int(1):
print('sky')
else:
print('floor')
flower(int(2))
flower(int(3))
在这个函数中,i为一个变元,输入的参数就存在着里面。但程序运行完时,变量就会被丢弃,需要输入新的变量。
-###return()语句返回值
利用return可以在创建函数时,指定返回什么值
import random
def flower(flowerNumber):
if flowerNumber == 1:
return 'It is sky'
elif flowerNumber == 2:
return 'It is floor'
else:
return 'It is river'
r = random.randint(1, 9)
fortune = flower(r)
print(fortune)
所输入的变量都要进行赋值,最后打印出来,这里的的赋值整体可以写成print(flower(random.randint(1,9))),而最后else部分也可以写成return None,不返回其他值。
-
关键字参数,在print时,可以用end、sep等关键字提供条件执行
print('hello',end='')
print('world')
print('flower',end='/t')
print('sky')
print('flower',sep=',')
print('sky')
关于全局作用域与局部作用域
一个函数被调用时, 就创建了一个局部作用域。在这个函数内赋值的所有变量,存在于该局部作用域内。该函数返回时,这个局部作用域就被销毁了, 这些变量就丢失了。下次调用这个函数, 局部变量不会记得该函数上次被调用时它们保存的值。(《python编程快速上手》)
-
1.局部作用域不能使用其他局部作用域内的变量
图中,最后打印出来的是99,即spam函数发挥作用,而bacon没有发挥作用,之后创建的bacon函数也为局部结构域,所以该程序可以出现多种局部结构域。局部作用域不能使用其他局部作用域内的变量。只要函数被调用了就创建了新的局部结构域。
-
2.局部变量不能在全局作用域内使用
eggs为局部变量,即使要输出eggs,也要输入spam(),才会打印eggs
def spam():
eggs = 31337
print(eggs)
spam()
-
3.全局变量可以在局部作用域中读取
def spam():
print(eggs)
eggs = 42
spam()
print(eggs)
该处的eggs为全局变量,由于spam函数调用了eggs之后spam的变量eggs就消失了,所以eggs之后可以供print调用
但是修改一下位置就不行了,eggs变成了局部变量所以变量的位置比较重要
-
4.名称相同的局部变量和全局变量
def spam():
eggs = 'spam local'
print(eggs) # prints 'spam local'
def bacon():
eggs = 'bacon local'
print(eggs) # prints 'bacon local'
spam()
print(eggs) # prints 'bacon local'
eggs = 'global'
bacon()
print(eggs) # prints 'global'
eggs的变量有:名为 eggs 的变量,存在于 spam()被调用时的局部作用域;名为 eggs 的变量,存在于 bacon()被调用时的局部作用域;名为 eggs 的变量,存在于全局作用域。
第1次打印是由于在全局变量下bacon()已经开始调用函数了,所以打印bacon(),向下则是调用spam函数,打印spam(),,然后再打印'bacon local',最后打印'global'
def spam():
eggs = 'spam local'
print(eggs) # prints 'spam local'
def bacon():
eggs = 'bacon local'
print(eggs) # prints 'bacon local'
spam()
print(eggs) # prints 'bacon local'
eggs = 'global'
bacon()
print(eggs) # prints 'global'
-
5.全局变量可以声明,使用global()函数
def spam():
global eggs
eggs = 'spam'
eggs = 'global'
spam()
print(eggs)
最后打印的是全局变量spam,而不是global