您的位置:首页 > 编程语言 > Python开发

Python学习笔记3:函数function

2017-10-12 16:25 465 查看
回顾return

return作为一个返回值,可以将函数内部我想要的值进行返回。

如果有返回值的时候不会有任何的输出,需要使用输出的函数进行输出。

如果在函数中遇到了return,下main的代码就不会执行。

一 变量的作用域

(1)全局变量

在函数外部声明的变量为全局变量,在函数内、外部都可以获取

name = 'Nian'
myList = [1, 2, 3]

def demo():
print(name)
print(myList)

demo()


(2)局部变量

在函数内部声明的变量为局部变量,在函数外部获取不到

def demo():
name = 'Nian'

demo()
print(name)  # name 'name' is not defined


( 3)关键字global

声明函数内、外部使用同一个变量

name = 'Nian'

def demo():
global name
print(name)
name = 'Luck'

print(name)

demo()
print(name)

'''
Nian
Nian
Luck
'''


(4)关键字nonelocal

在函数嵌套的时候可以获取外层函数的变量,函数内、外部逗使用的同一个变量。

def demo1():
num = 1

def demo2():
# print(num)
nonlocal num  # 使函数内外使用同一个变量
num = 2

demo2()
print(num)  # 2

demo1()


(5)可变类型,不可变类型

可变类型:比如你只修改了列表中的某个值,但是本身没有动

不可变类型:比如字符串、int...当你在给一个新的值的时候,原来的值会被丢弃,生成一个新的变量

myList = [1, 2, 3, 4]
myInt = 9

def demo():
myList[0] = 666
myInt = 777

demo()
print(myList)  # [666, 2, 3, 4]
print(myInt)  # 9


二 递归函数

递归函数就是自己调用自己的过程

优点:代码简短

缺点:代码不好维护,消耗大量cpu

def demo(n):
print(n)
if n > 1:
demo(n - 1)
print(n)

demo(3)

# 递归的分解
# 函数内部调用外部函数
# def func1():
#     func2()
#
# def func2():
#     print('我是func2函数')
#
# func1()


三 特殊的问题

a = 10

def demo():
a = a + 1

# 等同于:
def demo():
print(a)
a = 10

demo()  # local variable 'a' referenced before assignment


四 函数的导入

# import myfunction.returnFunction
# print(myfunction.returnFunction.demo(1, 2))

# 从myfunction文件夹导入returnFunction文件
# from myfunction import returnFunction
# print(returnFunction.demo(1, 2))

# 起别名
from myfunction import returnFunction as func
print(func.demo(1, 2))


五 列表推导式

概念

列表推导式提供了创建列表的简单途径


例子:

# 快速生成列表的一种方式
myList = [x for x in range(1, 5, 2)]
print(myList)  # [1, 3]

# 多维列表
myList = [[x ** 2] for x in range(1, 5, 2)]
print(myList)  # [[1], [9]]

myList = [(x, x ** 2) for x in range(1, 5, 2)]
print(myList)  # [(1, 1), (3, 9)]

# 带if条件,作为过滤
myList = [x for x in range(1, 20) if x % 2 == 0]
print(myList)  # [2, 4, 6, 8, 10, 12, 14, 16, 18]

# myList中 < 10 的过滤出来
myList2 = [i for i in myList if i < 10]
print(myList2)  # [2, 4, 6, 8]

# myList中的元素 + 1
myList3 = [i + 1 for i in myList]
print(myList3)  # [3, 5, 7, 9, 11, 13, 15, 17, 19]

# 循环嵌套
myList = [[i, x] for i in range(1, 4) for x in range(1, 3)]
print(myList)  # [[1, 1], [1, 2], [2, 1], [2, 2], [3, 1], [3, 2]]

# 行列转置
myList = [[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
]
# myList2 = [[row[i] for row in myList] for i in range(4)]
# print(myList2)

nullList = []
for i in range(4):
# print(i)
subList = []
for row in myList:
# print(row[i])
subList.append(row[i])
nullList.append(subList)


六 迭代器

可迭代对象

可以直接作用于for循环的对象称为可迭代对象(iterable),可以使用isinstance判断是否为可迭代对象。


可用于for循环的数据类型:

list    str dict      set     tuple


判断是否为可迭代对象,需要引入Iterable

from collections import Iterable

# 判断是否为可迭代对象
print(isinstance([], Iterable))
print(isinstance({}, Iterable))
print(isinstance('', Iterable))
print(isinstance(1, Iterable))


迭代器

迭代器是从对象集合的第一个元素开始访问,只能前进,不能后退。

迭代器有两个方法:iter()和next()——(iter是将可迭代对象转换成迭代器,next是将迭代器的元素依次访问)

当迭代器的元素都访问完以后,再次访问会报StopIteration的错误。

七 生成器

使用了yield函数的成为生成器

生成器也实现了迭代器的功能

使用列表生成式,这样生成出来的(x for x in range(1, 5))是生成器,并不是像列表一样一次性生产,而是用一个产一个。


使用(x for x in range(1, 5))的好处:

节约资源

# 对比节约资源
myGener = (x for x in range(10000000))
print('就是这么速度')

myGener2 = [x for x in range(1000000)]
print('你再看看我的这个慢速度')


加上yield函数(调用一次执行一次,避免一次性全部执行完毕,节约电脑资源)

配合

yield

next()

def demo():
print('a')
yield
print('b')
yield
print('c')
yield

# demo()
# print(demo())

# funcGener = demo()
# next(funcGener)
# next(funcGener)
# next(funcGener)
# next(funcGener)  # 当走完以后,会报StopIteration

def func():
for i in range(100):
print(i)
yield
# func()
myFunc = func()
next(myFunc)
next(myFunc)
next(myFunc)


八 异常处理

需求:当程序出现问题时,不让程序结束,而是越过错误,继续执行。

一个try语句可以包含多个except子句,分别来处理不同的异常,但是最多只会有一个分支被执行。

一个except子句可以包含多个异常,异常的名称放在元组里。

主体结构

try:
# 可能会发生异常的代码
except:  # 捕获所有的异常
# 处理出现的异常

# 一个try语句对应多个except
# try:
#     int('a')
# except TypeError as e:
#     print(e)
# except ValueError as v:
#     print(v)

try:
int('a')
except (TypeError, ValueError) as e:
print(e)


可选的else子句

如果想使用else子句,必须放在except之后,这个子句将在try语句没有任何异常的时候去执行。

格式:

# 可选的else子句
try:
# int('a')
a = 1
except (TypeError, ValueError) as e:
print(e)
else:
print('没有问题,就能看到')


finally

try子句中不管有没有发生异常,finally都会去执行。

# 配合finally
try:
int('a')
# a = 1
except (TypeError, ValueError) as e:
print(e)
else:
print('如果没有问题,就能看到')
finally:
print('你有没有异常,我都执行')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息