㈠ python中 自己定义的函数内生成的列表 怎么在外部中引用
下面的例子演示了用3种方法来在外部引用函数内部定义的列表:
#返回函数内部定义的列表
def int_list1():
l=[1,2]
return l
#将函数内部列表定义成全局的
def int_list2():
global l
l=[3,4]
#将函数内部列表定义成函数的一个属性
def int_list3():
l=[5,6]
int_list3.l=l
print(int_list1())
int_list2()
print(l)
int_list3()
print(int_list3.l)
这是截图:
㈡ 如何查看 Python 全部内置变量和内置函数
查看python内置函数的方法:1、打开Python IDLE编辑器;2、输入" dir(__builtins__)"命令,按下回车键(Enter)得到Python全部内置变量和函数。
如何查看 Python 全部内置变量和内置函数?
1 如图,打开 Python IDLE,我用的 是 Python 3.7 ,界面有个性定制。你的版本不同,界面有差异,但是操作方法应该是一样的。
2 输入 dir(__builtins__)
按下回车键(Enter)。
3 也可以:
import builtins
dir(builtins)
按下回车键(Enter)。
得到的结果和 dir(__builtins__) 是一样的。
4 那么这返回的一大堆到底是什么东西?
可以看到,返回的结果是以 [ 开头以 ] 结尾,说明是个列表,我们看看这列表里一共有多少个元素?
输入:
len(dir(__builtins__))
得到一个数字,154 ,说明当前版本的 Python 内置的常量和函数总数是 154 。
5 我们再重新输出一下这个列表,逐个打印出来,更好看一点。
for item in dir(__builtins__):
print(item)
按下两次回车键(Enter)。按照默认的字母顺序,先是大写字母 A-Z,然后是下划线(_)开头的,然后是小写字母 a-z ,为什么是这个顺序?因为按照 ASCII 码表,表示小写字母的数字比表示大写字母的数字要大,而表示下划线(_)的数字居中,所以如此。
6 print() 就是 Python 3 的默认函数。我们试试:
print('Hello World')
builtins.print('Hello World')
__builtins__.print('Hello World')
运行结果如下,可以看到,结果是一样的。
dir()本身就是 Python 的内置函数,利用它,我们可以查看对象的全部方法和属性,对于掌控全局,了解全貌很有用。
课程推荐:Python快速教程之从入门到精通
㈢ python 函数内声明的数组是全局的吗
不是全局的。如果你只是想在函数内弄一个全局变量,那么global可以很好地解决问题,但是如果是数组的话,你可以这样:先在函数外定义一个空列表(数组),然后再在函数内修改它,这样就是全局的啦!
㈣ Python基本内置数据类型有哪些
内置类型是指任何语言在设计初期定义的类型,如C语言中的int、double、char等。它也是在一种语言中最基本的类型,与编译器编译出的代码具有重大关系。值得一提的是,不同语言也拥有不同的内置类型, 但是所有内置类型的定义都与计算机的运算方式相关。
Python主要内置类型包括数值、序列、映射、类、实例和异常等。
数值类型:全局中只有一个(Python在解释器启动的时候,Python会用None类型生成一个None的对象),包括int类型、float类型、complex类型、bool类型。
迭代类型:在Python中,迭代类型可以使用循环来进行遍历。
序列类型:list(是可变序列,通常用于存放同类项目的集合)、tuple(是不可变序列,通常用于储存异构数据的多项集)、str(在Python中处理文本数据是使用str对象,也称为字符串。字符串是由Unicode码位构成的不可变序列。)、array、range(表示不可变的数字序列,通常用于在for循环中循环指定的次数)、bytes(由单个字节构成的不可变序列)、bytearray(bytes对象的可变对应物)、memoryvie(二进制序列)
映射类型:映射对象将具有hash的值映射到任意对象。映射是可变的对象。目前只有一种标准映射,即dictionary。字典的键几乎是任意值,也就是说,包含列表、字典或其他可变类型的值。
集合类型:作为一种无序的多项集,集合并不记录元素位置或插入顺序。相应地,集合不支持索引、切片或其他序列类的操作。目前Python有两种内置集合类型:set和frozenset。
set类型是可变的,其内容可以使用add()和remove()这样的方法来改变。由于是可变类型,它没有哈希值,且不能被用作字典的键或其他集合的元素。
frozenset类型是不可变并且具有哈希值,其内容在被创建后不能再改变,因此它可以被用作字典的键或其他集合的元素。
上下文管理类型:with语句
其他类型:模块、class、实例、函数、方法、代码、object对象、type对象、ellipsis(省略号)、notimplemented
㈤ python中的列表是不是全局性的详见描述
1、py列表在主程序区创建后似乎能在各个定义的函数中读取,不知我说的是否正确?
答:是的,在函数外创建的变量是全局变量,在函数中是可以读写全局变量的。
2、还想请问一下,有没有其他数据类型能全局使用?
答:变量是否全局并不是因为它的数据类型,而是要看它是在哪里定义的,在函数外定义就是全局,函数内定义就是局部。
3、变量这种的是不是局部性,只能在当前函数或程序中使用?
函数内部定义的变量只能在函数内部调用。
㈥ python3.5类型参数列表问题,怎么解决
刚开始学习python,python相对于java确实要简洁易用得多。内存回收类似hotspot的可达性分析, 不可变对象也如同java得Integer类型,with函数类似新版本C++的特性,总体来说理解起来比较轻松。只是函数部分参数的"*"与"**",闭包等问题,着实令人迷糊了一把,弄清概念后写下此文记录下来,也希望本文能够帮助其他初学者。
所以本文是一篇学习笔记,着重于使用的细节和理解上,首先分别介绍了函数各种参数类型在调用和声明时的区别,及其在混用时需要注意的一些细节,之后讲了闭包相关的内容。如果有不对的地方欢迎指正。
函数参数不带“*”,"*" 与 "**"的区别
理解这个问题得关键在于要分开理解调用和声明语法中3者得区别.
函数调用区别
1. 不同类型的参数简述
#这里先说明python函数调用得语法为:
复制代码代码如下:
func(positional_args, keyword_args,
*tuple_grp_nonkw_args, **dict_grp_kw_args)
#为了方便说明,之后用以下函数进行举例
def test(a,b,c,d,e):
print a,b,c,d,e
举个例子来说明这4种调用方式得区别:
复制代码代码如下:
#-------------------------------
#positional_args方式
>>> test(1,2,3,4,5)
1 2 3 4 5
#这种调用方式的函数处理等价于
a,b,c,d,e = 1,2,3,4,5
print a,b,c,d,e
#-------------------------------
#keyword_args方式
>>> test(a=1,b=3,c=4,d=2,e=1)
1 3 4 2 1
#这种处理方式得函数处理等价于
a=1
b=3
c=4
d=2
e=1
print a,b,c,d,e
#-------------------------------
#*tuple_grp_nonkw_args方式
>>> x = 1,2,3,4,5
>>> test(*x)
1 2 3 4 5
#这种方式函数处理等价于
复制代码代码如下:
a,b,c,d,e = x
print a,b,c,d,e
#特别说明:x也可以为dict类型,x为dick类型时将键传递给函数
>>> y
{'a': 1, 'c': 6, 'b': 2, 'e': 1, 'd': 1}
>>> test(*y)
a c b e d
#---------------------------------
#**dict_grp_kw_args方式
>>> y
{'a': 1, 'c': 6, 'b': 2, 'e': 1, 'd': 1}
>>> test(**y)
1 2 6 1 1
#这种函数处理方式等价于
a = y['a']
b = y['b']
... #c,d,e不再赘述
print a,b,c,d,e
2. 不同类型参数混用需要注意的一些细节
接下来说明不同参数类型混用的情况,要理解不同参数混用得语法需要理解以下几方面内容.
首先要明白,函数调用使用参数类型必须严格按照顺序,不能随意调换顺序,否则会报错. 如 (a=1,2,3,4,5)会引发错误,; (*x,2,3)也会被当成非法.
其次,函数对不同方式处理的顺序也是按照上述的类型顺序.因为#keyword_args方式和**dict_grp_kw_args方式对参数一一指定,所以无所谓顺序.所以只需要考虑顺序赋值(positional_args)和列表赋值(*tuple_grp_nonkw_args)的顺序.因此,可以简单理解为只有#positional_args方式,#*tuple_grp_nonkw_args方式有逻辑先后顺序的.
最后,参数是不允许多次赋值的.
举个例子说明,顺序赋值(positional_args)和列表赋值(*tuple_grp_nonkw_args)的逻辑先后关系:
复制代码代码如下:
#只有在顺序赋值,列表赋值在结果上存在罗辑先后关系
#正确的例子1
>>> x = {3,4,5}
>>> test(1,2,*x)
1 2 3 4 5
#正确的例子2
>>> test(1,e=2,*x)
1 3 4 5 2
#错误的例子
>>> test(1,b=2,*x)
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
TypeError: test() got multiple values for keyword argument 'b'
#正确的例子1,处理等价于
a,b = 1,2 #顺序参数
c,d,e = x #列表参数
print a,b,c,d,e
#正确的例子2,处理等价于
a = 1 #顺序参数
e = 2 #关键字参数
b,c,d = x #列表参数
#错误的例子,处理等价于
a = 1 #顺序参数
b = 2 #关键字参数
b,c,d = x #列表参数
#这里由于b多次赋值导致异常,可见只有顺序参数和列表参数存在罗辑先后关系
函数声明区别
理解了函数调用中不同类型参数得区别之后,再来理解函数声明中不同参数得区别就简单很多了.
1. 函数声明中的参数类型说明
函数声明只有3种类型, arg, *arg , **arg 他们得作用和函数调用刚好相反. 调用时*tuple_grp_nonkw_args将列表转换为顺序参数,而声明中的*arg的作用是将顺序赋值(positional_args)转换为列表. 调用时**dict_grp_kw_args将字典转换为关键字参数,而声明中**arg则反过来将关键字参数(keyword_args)转换为字典.
特别提醒:*arg 和 **arg可以为空值.
以下举例说明上述规则:
复制代码代码如下:
#arg, *arg和**arg作用举例
def test2(a,*b,**c):
print a,b,c
#---------------------------
#*arg 和 **arg可以不传递参数
>>> test2(1)
1 () {}
#arg必须传递参数
>>> test2()
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
TypeError: test2() takes at least 1 argument (0 given)
#----------------------------
#*arg将顺positional_args转换为列表
>>> test2(1,2,[1,2],{'a':1,'b':2})
1 (2, [1, 2], {'a': 1, 'b': 2}) {}
#该处理等价于
a = 1 #arg参数处理
b = 2,[1,2],{'a':1,'b':2} #*arg参数处理
c = dict() #**arg参数处理
print a,b,c
#-----------------------------
#**arg将keyword_args转换为字典
>>> test2(1,2,3,d={1:2,3:4}, c=12, b=1)
1 (2, 3) {'c': 12, 'b': 1, 'd': {1: 2, 3: 4}}
#该处理等价于
a = 1 #arg参数处理
b= 2,3 #*arg参数处理
#**arg参数处理
c = dict()
c['d'] = {1:2, 3:4}
c['c'] = 12
c['b'] = 1
print a,b,c
2. 处理顺序问题
函数总是先处理arg类型参数,再处理*arg和**arg类型的参数. 因为*arg和**arg针对的调用参数类型不同,所以不需要考虑他们得顺序.
复制代码代码如下:
def test2(a,*b,**c):
print a,b,c
>>> test2(1, b=[1,2,3], c={1:2, 3:4},a=1)
Traceback (most recent call last):
File "<stdin>", line 1, in <mole>
TypeError: test2() got multiple values for keyword argument 'a'
#这里会报错得原因是,总是先处理arg类型得参数
#该函数调用等价于
#处理arg类型参数:
a = 1
a = 1 #多次赋值,导致异常
#处理其他类型参数
...
print a,b,c
闭包
python的函数,原本只能访问两个区域的变量:全局,和局部(函数上下文). 实际上,函数本身也是一个对象,也有自己的作用域. 闭包通过函数与引用集合的组合,使得函数可以在它被定义的区域之外执行. 这个集合可以通过func_closure来获取这个引用集合. 这与python处理全局变量得方式一样,只不过全局变量将引用集合存储在__globals__字段中.func_closure是一个存储cell类型的元组,每个cell存储一个上下文变量.
另外,旧版本得python的内部函数不能在其他作用域使用的原因,并不是因为每个作用域的变量严格相互隔离,而是脱离原本的作用域后,函数失去了原本上下文的引用。需要注意的是,闭包存储的上下文信息一样是浅拷贝,所以传递给内部函数的可变对象仍然会被其他拥有该对象引用得变量修改.
举个例子:
复制代码代码如下:
>>> def foo(x,y):
... def bar():
... print x,y
... return bar
...
#查看func_closure的引用信息
>>> a = [1,2]
>>> b = foo(a,0)
>>> b.func_closure[0].cell_contents
[1, 2]
>>> b.func_closure[1].cell_contents
0
>>> b()
[1, 2] 0
#可变对象仍然能被修改
>>> a.append(3)
>>> b.func_closure[0].cell_contents
[1, 2, 3]
>>> b()
[1, 2, 3] 0
㈦ python 获取global contact list
贴出完整源代码。
代码中:使用二维码登录网页版微信,并下载好友头像,并将好友资料数据存入csv文件,待进一步处理全局联络人列表也被导入在导入之后,某些列表被提供给用户的地址簿,如果用户已选择了该选项的话全局联络人列表(GlobalContactList)是经由GUID标识的给定源用户的联络人的有序列表。
Python是一种跨平台的计算机程序设计语言是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发Python的应用领域还是非常广泛的,因为Python是一种解释型脚本语言,所以可以应用的领域就非常的丰富,比如:Web和Internet开发,科学计算和统计,人工智能,桌面界面开发,软件开发,后端开发。
㈧ python 列表 全局
都有全局和局部之分;
你那个情况可能是把list当作全局变量了;
㈨ python中怎么定义全局变量
复制代码
count = 0
def Fuc(count):
print count
count += 1
for i in range(0, 10):
Fuc(count)
复制代码
结果是:
不是我们想要的结果。
解决之道一——全局变量:
复制代码
global a
a = 3
def Fuc():
global a
print a
a = a + 1
if __name__ == "__main__":
global a
for i in range(10):
Fuc()print 'hello'
print a
复制代码
结果:
注意要领:
哪里需要全局变量,哪里声明一下;但是函数千万不要传参数, Fuc(a)是不行的。
解决之道二——列表:
复制代码
a = [3]
def Fuc():
print a[0]
a[0] = a[0] + 1
if __name__ == "__main__":
global a
for i in range(10):
Fuc()
print 'hello'
print a[0]
复制代码
结果同上
列表可以比肩简单的实现,学习之。
㈩ python里 列表是不是不像全局变量,会在函数中被改变
我觉得是,列表是个一种数据结构,而100是个整数类型的数据,其值是存在在内存里,调用函数可以改变数据结构,但是改变不了内存里的值,你可以试下改变列表里的值。