美文网首页
函数基础三

函数基础三

作者: 憧憬001 | 来源:发表于2018-11-16 19:33 被阅读0次

一、变量的作用域

  • 变量在程序中能够使用的范围
  • 1.全局变量
    a.声明在函数或者类的外部的变量都是全局变量
    b.全局变量是从声明开始到整个py文件结束,任何位置都可以使用(作用域:从声明开始到文件结束)
  • 2.局部变量
    a.声明在函数或者类的里面的变量都是局部变量
    b.局部变量是从声明开始到函数结束,任何位置都可以使用(作用域:从声明开始到函数结束)
# ===========1.全局变量===========
# 全局变量
a = 10

# x和y是全局变量
for x in range(10):
    y = 20
    print(x)

print(x, y)

if True:
    # b是全局变量
    b = 20
print(b)

def func1():
    print('函数中:', a)
    print('函数中', x, y)

# ============2.局部变量=============
# num1, num2, aa, xx都是局部变量
def func2(num1, num2):
    print(num1, num2)
    aa = 11
    print(aa)
    for xx in range(5):
        print(xx)
    print(xx)
  • global关键字只能在函数中使用,作用是在函数中声明一个全局变量
  • 语法:
    global 变量名
    变量名 = 值
# 声明一个全局变量a1
a1 = 100


def test1():
    # 声明一个局部变量a1
    # a1 = 200
    # print(a1)

    global a1
    a1 = 200
    print(a1)

    # 在函数中声明全局变量b1
    global b1
    b1 = 300
  • nonlocal关键字只能在函数中使用
    当需要在局部的局部中修改局部变量的值,就使用nonlocal
  • 语法:
    nonlocal 变量名
    变量名 = 值
def func1():
    # 声明一个局部变量a2
    a2 = 'abc'

    # python中函数可以声明函数
    def func11():
        nonlocal a2
        a2 = 'python'
        print('func11-a2:', a2)
        # a3的作用域在func11中
        a3 = 111
    func11()
    print('func1-a2:', a2)

# 思考?
funtions = []
for x in range(5):
    def func1(a):
        return a*x
    funtions.append(func1)

t1 = funtions[0]
t2 = funtions[2]
print(t1(2))
print(t2(2))

二、函数作为变量

  • python中,声明函数其实就是声明一个类型是function的变量,函数名就是变量名
    函数名作为变量除了可以用来调用函数获取返回值
# 声明类型是int类型的变量a
a = 10
print(type(a))

# 声明类型是dict类型的变量b
b = {'a': 12, 'b': 200}
print(type(b))
print(b['a'])

# 声明类型是function类型的变量c
c = lambda x: x*x
print(type(c))
c(10)


# # 声明类型是function类型的变量d
def d(x):
    def e():
        print('abc')
    e()
    return x*x


print(type(d))
d(10)

# 1.让一个变量给另外一个变量赋值
# 声明一个列表变量list1
list1 = [1, 2, 3]
# 使用列表变量list1给list2赋值
list2 = list1
# 将list2当成列表来用
print(list2[0])


# 声明一个函数变量func11
def func11():
    print('我是函数')

#  使用函数变量func11给ff赋值
ff = func11
# 将ff当成函数来用
ff()

# 2.将变量作为列表的元素或者字典的值
# 声明列表变量list1
list1 = [100, 200, 300]
# 将列表变量list1作为列表list2的元素
list2 = [list1, 100]
print(list2[0][0])


# 声明一个函数变量func2
def func2():
    print('我是函数2')
# 将函数变量func2作为列表list2的元素
list2 = [func2, 100]
print(list2[0]())

  • 将函数1作为实参,传递给函数2;这儿的函数2就是一个高阶函数(实参高阶函数)
def test(x):
    # x = func3
    print('test:', x)
    if not isinstance(x, int):
        x()

# 声明一个int类型的变量a
a = 10
# 将变量a作为test的实参
test(a)

# 声明一个fucntion类型的变量func3
def func3():
    print('我是函数3')
test(func3)
  • sort函数
    def sort(self, key=None, reverse=False)
    key - 确定排序的时候以什么值为标准来排序(默认以列表元素大小为标准排序)
    需要传一个函数(函数需要一个参数和一个返回值,参数是指列表的一个元素)
    reverse - 是否降序排序,需要一个bool值
o = lambda x: x[1]
print(max([("a", 100), ("b", 20), ("c", 10)], key=o))

三、迭代器

  • 1.迭代器(iter)
    迭代器是python中容器类的数据类型,可以同时存储多个数据
    取迭代器中的数据只能一个一个取,取出来的数据就不存在了
  • 2.迭代器中数据来源
    a.将其他序列转换成迭代器
    b.使用生成式、生成器去产生数据
    所有序列都能转换成迭代器
# 将数据转化成迭代器
iter1 = iter("sdks")
print(iter1)

iter2 = iter([1, 25, 54])
print(iter2)

iter3 = iter({"name": "装甲师", "age": 500})
print(iter3)
>>>>
<str_iterator object at 0x000001B630C9F2E8>
<list_iterator object at 0x000001B630C9F320>
<dict_keyiterator object at 0x000001B630BA86D8>
  • 2.获取迭代器中的元素
    next(迭代器) - 取出迭代器中第一个元素(已经取出的元素,不能返回)
    StopTteration
    当迭代器是空的时候,使用next获取元素,会出现StopTteration异常
    通过for循环取出迭代器中的每个元素
    四、生成器
  • 什么是生成器
    生成器就是迭代器;迭代器不一定是生成器

调用带有yield关键字的函数,拿到的结果就是一个生成器。生成器中元素就是yield关键字后边的值

2.生成器怎么产生数据
只要函数中有yield关键字,调用函数不会再执行函数体获取返回值,而是创建一个生成器。
当获取生成器的元素的时候,才会执行函数的函数体,执行到yield语句为止,并且将yield后面的值作为结果返回;
并且保存当前执行的位置。
获取下一个元素的时候,就从上次结束的位置接着往下去执行函数,直到函数结束或者遇到yield为止;
如果遇到yield就将yield后面的值作为结果返回,并且保存当前执行的位置。如果函数结束了,就出现StopIteration异常
生成器对应的函数,执行完成遇到yield的次数,决定了生成器能产生的数据的个数

def creat_id():
    num = 0
    while True:
        yield "stu" + str(num).zfill(3)
        num += 1

gener_id = creat_id()
for _ in range(11):
    print(next(gener_id))
>>>>
stu001
stu002
stu003
stu004
stu005
stu006
stu007
stu008
stu009
stu010

四、生成式

  • 迭代器:容器,可以同时存储多个数据,取的时候只能一个一个取,
    并且取出的不能返回
    生成器:就是迭代器,数据是通过调用函数,获取yield后面的值而产生的
    数据会在获取的时候产生
    调用一个yield关键的函数,就是创建一个生产器

  • 生成式
    """

  • 格式一:结果是一个生成器(迭代器)
    (表达式 for 变量 in 序列) --> 展开:
    def func():
    for 变量 in 序列:
    yeild 表达式
    注意:表达式的结果就是每次循环生成器产生的数据

  • 格式2:
    (表达式 for 变量 in 序列 if 条件语句)
    ----> 展开:
    def func1():
    for 变量 in 序列:
    if 条件语句:
    yeild 表达式

gen1 = (10 for i in range(5))
print(gen1)
print(next(gen1))

gen2 = (i for i in range(5))
for _ in range(5):
    print(next(gen2))

gen3 = (i for i in range(10) if i % 2)
for _ in range(5):
    print(next(gen3))
list1 = list(i for i in range(10) if i % 2)
print(list1)
>>>>
<generator object <genexpr> at 0x00000263E742B830>
10
0
1
2
3
4
1
3
5
7
9
[1, 3, 5, 7, 9]
{1: 'a', 2: 'b', 3: 'c'}

五、模块

1.python 中一个文件就是一个模块

关联

  • 方式一: import 模块名 - 将指定的模块导入当前模块中(模块名就是py文件的文件名)
    说明:
    a.执行import的时候,实质会进入指定的模块对应的py文件中,去执行里面的内容
    b.import导入模块的时候,会检测当前模块之前是否已经导入过,如果已经导入就不在导入
    c.通过import去导入一个模块后,可以通过 模块名.全局变量 去使用被导入模块中的内容
  • 方式二:
from 模块名 import 变量名/函数名 - 导入模块中指定的变量和函数
说明:
a.执行到导入模块的语句的时候,还是会执行指定模块中的所有语句
b.通过from - import 导入的时候,导入多次还是只执行一次(查重)
c.使用的时候只能用import后面的变量/函数,而且用的时候不用在前面加模块名
d.import后面可以使用逗号将多个变量/函数隔开,也可以使用*号将模块中所有的全局变量一起导入
- 重新名
import 模块名 as 新模块名
form 模块名 import 变量名 as 新变量名
##### 2.补充
- 函数 - 对功能进行封装 - 获取当前时间对应的代码封装到函数中
模块 - 对多个功能和多个数据进行封装 - 将所有和xx相关的函数或变量放到一个py文件里
包 - 对多个模块进行封装  - 将所有和时间相关的朋友文件放到一个文件夹中
包:含有 __init__.py文件的文件夹

包的导入
import 包名    - 会直接执行摆钟的 __init__.py文件的内容
import 包名.模块名 - 导入包中指定的模块
from 包名 import 模块名
form 包名.模块名 import 变量
#### 六、选择性导入
- 在模块中将不需要其他其他模块导入和执行的代码写到if __name__ == '__main__':语句
这样就可以阻止代码被其他模块执行

原理:每个模块都有一个__name__属性,默认值是模块对应的py文件的名字
     当正在直接执行模块的时候,模块的__name__属性值就会变成'__main__'
     当import模块的时候,执行模块,模块的__name__属性不是'__main__'
if __name__ == '__main__':
    # 写在这儿的代码不会被其他模块执行;声明的变量也不会被其他模块执行
    print("我就在这儿,不走")

相关文章

  • 函数基础三

    一、变量的作用域 变量在程序中能够使用的范围 1.全局变量a.声明在函数或者类的外部的变量都是全局变量b.全局变量...

  • 原型链经典面试题

    命题点一:原型基础 + 构造函数基础 命题点二:自有属性与原型继承属性 命题点三:构造函数综合考察

  • Python基础(三)函数

    一. 函数的定义定义函数的格式如下: 定义函数的格式如下: 1.def 函数名():函数封装的代码…… 1. de...

  • Golang基础(三) | 函数

    函数 函数是Go里面的核心设计,它通过关键字func来声明,它的格式如下: 上面的代码我们看出 关键字func用来...

  • 三、Python函数基础

    字符串进阶 格式化输出 列表进阶 函数 变量的作用域和global变量 lambda匿名函数 python 使用 ...

  • 3-Python 函数(2)

    本章概要:1、函数基础2、深入理解函数3、综合练习 1、函数基础 课程概要:理解函数定义函数调用函数函数文档 一、...

  • python函数知识大全

    阅读目录 一 函数知识体系 二 函数基础 三 函数对象、函数嵌套、名称空间与作用域、装饰器 四 迭代器、生成器、面...

  • Kotlin学习笔记二(函数语法)

    基础函数语法 扩展函数 用于扩展无法控制第三方类库等 Kotlin中的Lambda函数相关语法 高阶函数 一个函数...

  • js函数、变量和函数预解析

    函数基础 函数的调用 函数与解析

  • TypeScript基础入门 - 函数 - this(三)

    转载 TypeScript基础入门 - 函数 - this(三) 项目实践仓库 为了保证后面的学习演示需要安装下t...

网友评论

      本文标题:函数基础三

      本文链接:https://www.haomeiwen.com/subject/auhmfqtx.html