ca88会员登录中心Python学习笔记整理3之输入输出,用法解析

ca88会员登录中心

Python学习笔记整理3之输入输出、python eval函数,

1. python中的变量:

python中的变量声明不需要像C++、Java那样指定变量数据类型(int、float等),因为python会自动地根据赋给变量的值确定其类型。如
radius = 20,area = radius * radius * 3.14159
,python会自动的将radius看成“整型”,area看成“浮点型”。所以编程时不用再像之前那样小心翼翼的查看数据类型有没有出错,挺人性化的。

2. input和print:

先贴个小的程序

# Prompt the user to enter three numbersnumber1 = eval(input("Enter the first number: "))number2 = eval(input("Enter the second number: "))number3 = eval(input("Enter the third number: "))# Compute averageaverage = (number1 + number2 + /      number3) / 3#Display resultprint("The average of ", number1, number2, number3,  
 "is", average)

小程序中的几个知识点:

1)print的格式,print(itme1, item2, …,
itemk),如果print的内容过长,可以直接换行;
2)’/’符号,它是用来连接两个行的,如果一行内容过长可以用该符号来分割;
3)input(”
“),获得输入数据,要注意的是,python2.x版本中有两个输入函数input()和raw_input(),input()输入实数时,它的值就是实数;而raw_input()不管输入的是什么,它的值都是string,所以需要用eval()函数将值转换为实数,eval()下面再深入学习;而在python3.x版本中只有一个输入函数input(),它的功能就相当于python2.x中的raw_input()函数,所以编程时要特别注意版本问题,像这样的差异还有许多。我的程序是在python3.2下解释的,如果在python2.x下,可以去掉eval()或者将input改成raw_input,结果一样。

3. eval()函数

上面的小程序中用到了eval()函数,功能是将string变成算术表达式来执行,比如eval(“1+2”)的结果是3。那么是不是它的功能就局限于此呢?
在这个基础上,我查了python官方文档关于eval函数的定义和解释。官网python3.4.1文档中关于eval的定义如下:
eval(expression, globals=None, locals=None)  —
官方文档中的解释是,globals和locals参数是可选的,如果提供了globals参数,那么它必须是dictionary类型;如果提供了locals参数,那么它可以是任意的map对象。

在继续往下之前,要先补充一点关于python命名空间的知识(引用自

在一个 Python
程序中的任何一个地方,都存在几个可用的名字空间。每个函数都有着自已的名字空间,叫做局部名字空间,它记录了函数的变量,包括函数的参数和局部定义的变
量。每个模块拥有它自已的名字空间,叫做全局名字空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。还有就是内置名字空间,
任何模块均可访问它,它存放着内置的函数和异常。

当一行代码要使用变量 x 的值时,Python
会到所有可用的名字空间去查找变量,按照如下顺序:

1)局部名字空间 – 特指当前函数或类的方法。如果函数定义了一个局部变量 x,
或一个参数 x,Python 将使用它,然后停止搜索。

2)全局名字空间 – 特指当前的模块。如果模块定义了一个名为 x
的变量,函数或类,Python 将使用它然后停止搜索。

3)内置名字空间 – 对每个模块都是全局的。作为最后的尝试,Python 将假设 x
是内置函数或变量。

其实这并不难理解,说白了,就是c++中全局变量和局部变量的意思。比如你在一个函数中用了num这个变量,它首先会查找函数里,也就是局部名字空间是否有这个变量名;如果找不到,就会到函数外也就是全局名字空间中继续查找;如果再找不到,就会查找内置关键字;如果都找不到,那么就只有报NameError了。

理解了这一点,就比较容易了。python的全局名字空间存储在一个叫globals()的dict对象中;局部名字空间存储在一个叫locals()的dict对象中。我们可以用print
(locals())来查看该函数体内的所有变量名和变量值。继续eval()函数…

1)当后两个参数都为空时,很好理解,就是一个string类型的算术表达式,计算出结果即可。等价于eval(expression)。

2)当locals参数为空,globals参数不为空时,先查找globals参数中是否存在变量,并计算。

3)当两个参数都不为空时,先查找locals参数,再查找globals参数。

举一个小例子:

#test eval() and locals()x = 1y = 1num1 = eval("x+y")print (num1)def g():  
 x = 2  
 y = 2  
 num3 = eval("x+y") 
 print (num3)    
num2 = eval("x+y",globals())  
 # num2 = eval("x+y",globals(),locals()) 
 print (num2)g()

num1的值不用说,是2;num3的值也很好理解,是4;num2的值呢?由于提供了globals()参数,那么首先应当找全局的x和y值,也就是都为1,那么显而易见,num2的值也是2。如果注释掉该句,执行下面一句呢?根据第3)点可知,结果为4。(PS:我的运行环境是python3.2)当然,也可以显式的定义dict对象作为eval()的参数,规则是一样的。

补充一下:locals()对象的值不能修改,globals()对象的值可以修改,写一个小程序测试一下。

#test globals() and locals()z=0def f(): 
z = 1  
print (locals())    
locals()["z"] = 2  
print (locals())  
f() globals()["z"] = 2print (z)

可以得出,两个print (locals())的结果是一样的,说明没有修改成功。而print
(z)的值是2,说明修改成功了。另外,貌似locals()可以添加变量,感兴趣的可以试一下。

以上内容是小编给大家分享的Python学习笔记整理3之输入输出、python
eval函数的全部叙述,希望大家喜欢。

今天书接昨天的函数继续去学习了解:
昨天说到函数的动态参数。

Python基础教程之内置函数locals()和globals()用法分析,pythonglobals

本文实例讲述了Python基础教程之内置函数locals()和globals()用法。分享给大家供大家参考,具体如下:

  1. 这两个函数主要提供,基于字典的访问局部变量和全局变量的方式。

python 使用叫做名字空间的东西来记录变量的轨迹。名字空间是一个字典
,它的键就是字符串形式的变量名字,它的值就是变量的实际值。

名字空间可以像 Python 的 dictionary 一样进行访问。

在一个 Python 程序中的任何一个地方,都存在几个可用的名字空间。

每个函数都有着自已的名字空间,叫做局部名字空间,它记录了函数的变量,包括函数的参数和局部定义的变量。

每个模块拥有它自已的名字空间,叫做全局名字空间,它记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。

还有就是内置名字空间,
任何模块均可访问它,它存放着内置的函数和异常。

  1. 当一行代码要使用变量 x 的值时,Python
    会到所有可用的名字空间去查找变量,按照如下顺序:

局部名字空间 –
特指当前函数或类的方法。如果函数定义了一个局部变量 x, 或一个参数
x,Python 将使用它,然后停止搜索。

全局名字空间 –
特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python
将使用它然后停止搜索。

内置名字空间 –
对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是内置函数或变量。

如果 Python 在这些名字空间找不到 x,它将放弃查找并引发一个 NameError
异常,同时传递 There is no variable named ‘x’ 这样一条信息.

  1. 名字空间在运行时直接可以访问。局部名字空间可以通过内置的 locals
    函数来访问。全局 (模块级别) 名字空间可以通过内置的 globals 函数来访问。

locals 对局部 (函数) 名字空间做了些什么,globals 就对全局 (模块)
名字空间做了什么。

然而 globals
更令人兴奋,因为一个模块的名字空间包含了模块级的变量和常量,它还包括了所有在模块中定义的函数和类,以及任何被导入到模块中的东西。

  1. 回想一下 from module import 和 import module 之间的不同?

使用 import
module,模块自身被导入,但是它保持着自已的名字空间,这就是为什么您需要使用模块名来访问它的函数或属性:
module.function 的原因。

但是使用 from module
import,实际上是从另一个模块中将指定的函数和属性导入到您自己的名字空间,这就是为什么您可以直接访问它们却不需要引用它们所来源的模块的原因。

使用 globals 函数,您会真切地看到这一切的发生。

  1. locals()实例:

    def foo(arg, a):
    x = 100
    y = ‘hello python!’
    for i in range(10):

     j = 1
     k = i
    

    print locals()
    foo(1,2)

结果:

{'a': 2, 'i': 9, 'k': 9, 'j': 1, 'arg': 1, 'y': 'hello python!', 'x': 100}
  1. locals 是只读的,不可修改,
    而globals可以修改,原因是:

locals()实际上没有返回局部名字空间,它返回的是一个拷贝。所以对它进行修改,修改的是拷贝,而对实际的局部名字空间中的变量值并无影响。

globals()返回的是实际的全局名字空间,而不是一个拷贝: 与 locals
的行为完全相反。

所以对 globals 所返回的 dictionary
的任何的改动都会直接影响到全局变量的取值。

#!/usr/bin/env python
#coding:utf-8
'''''This is my first python program!'''
z = 7 #定义全局变量
def foo(arg):
  x = 1
  print locals()
  print 'x=',x
  locals()['x'] = 2 #修改的是局部名字空间的拷贝,而实际的局部名字空间中的变量值并无影响。
  print locals()
  print "x=",x
foo(3)
print globals()
print 'z=',z
globals()["z"] = 8 #globals()返回的是实际的全局名字空间,修改变量z的值
print globals()
print "z=",z

结果:

{'x': 1, 'arg': 3}
x= 1
{'x': 1, 'arg': 3}
x= 1
{'foo': <function foo at 0x02A17CF0>, '__builtins__': <module '__builtin__' (built-in)>, '__file__': 'E:\\workspace\\python day03\\main\\test.py', '__package__': None, '__name__': '__main__', 'z': 7, '__doc__': 'This is my first python program!'}
z= 7
{'foo': <function foo at 0x02A17CF0>, '__builtins__': <module '__builtin__' (built-in)>, '__file__': 'E:\\workspace\\python day03\\main\\test.py', '__package__': None, '__name__': '__main__', 'z': 8, '__doc__': 'This is my first python program!'}
z= 8

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python函数使用技巧总结》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

本文实例讲述了Python基础教程之内置函数locals()和globals()用法。分享给大家供…

您可能感兴趣的文章:

  • Python之eval()函数危险性浅析
  • Python 执行字符串表达式函数(eval exec execfile)
  • Python中的exec、eval使用实例
  • python学习笔记之调用eval函数出现invalid syntax错误问题

eval函数,

  1. python中的变量:
    python中的变量声明不需要像C++、Java那样指定变量数据类型(int、float等…

1、函数的【动态参数】

*args 动态参数,万能参数
args接受的就是实参对应的所有剩余的位置参数,并将其放在元组( )中。

def func(x, y, z, *args):
   print(x, y, z)
   print(args)

func(1, 2, 'a', 'b', 'c', 34)

1 2 a
('b', 'c', 34)

**kwargs 动态参数
将非位置对应的所有的关键字参数放到一个字典{  }中。
(排除形参中位置参数对应的实参中的关键字参数)
def func(x, y, z, *args, sex='男', **kwargs):
   print(x, y, z)
   print(args)
   print(sex)
   print(kwargs)

func(1, 2, 'a', 'b', 'c', 34, m='yue', n=12, sex='女', p='r')

1 2 a
('b', 'c', 34)
女
{'m': 'yue', 'p': 'r', 'n': 12}

从形参的角度来看,它们的顺序应为:
位置参数在最前,*args次之,
默认参数因为形式上是关键字参数的式样故要排在*args后,而要在**kwargs之前。
(位置参数,*args,默认参数,**kwargs)

2、函数中【*和**的魔法运用】

在函数的调用(执行)时,*加一个可迭代对象(列表,元祖,字符串,字典等)代表解包,
(列表元祖打散成列表中的每个元素,字符串打散成每个字符,字典打散成每个键)
并将元素一 一添加进args。

如下例:

def func(*args):
    return args
l1 = [1, 2, 30]
l2 = [1, 2, 33, 21, 45, 60]
# 要求将l1 和 l2 转化成元祖,
# 并且里面包含所有l1和l2的每一个元素,相同元素也得重复。
# 解:
tu = func(*l1, *l2)
print(tu)

(1, 2, 30, 1, 2, 33, 21, 45, 60)

也可以简单理解成*是求可迭代对象的每一个元素。

而在函数的定义时,*args代表的是聚合(打包成元祖)

**运用只限于字典(因它存在有键值对,可两两对应上),
同样在函数的调用执行时,**dict(一个字典对象),代表将字典所有的键值对放到kwargs字典里。
(解包打散字典)

例:
def func(**kwargs):
    return kwargs
dic = {'name':'tiele', 'age':18, 'hobby':'下棋'}
dic2 = {'name2':'mao', 'age2':5, 'hobby2':'晒太阳'}
# 字典的键得是唯一,如果两个字典同键虽然不同值,执行下面函数的**运用也会报错
dic3 = func(**dic, **dic2)
print(dic3)

{'name': 'tiele', 'age': 18, 'hobby2': '晒太阳', 'hobby': '下棋', 'age2': 5, 'name2': 'mao'}


在函数定义时,**kwargs代表的是聚合(成字典)

3、全局命名空间、局部命名空间、内置命名空间

名称空间:放置变量与对应的值(有的还有内存地址对应)的关系;

全局命名空间,放置变量与对应的值(有的还有内存地址对应)的关系的名称空间。

当执行函数的时候,内存开辟出一个临时名称空间(又叫局部命名空间),存放该函数内的变量与值的关系。
随着函数的执行完毕,临时名称空间也随之关闭。

内置名称空间,(python的内置函数),所有的内置函数等存储的空间。

4、顺序与函数的嵌套

加载顺序:
内置名称空间—>全局名称空间—>(函数执行时)—>局部名称空间。

取值顺序:
刚好与加载顺序相反,优先级为:
局部名称空间—>全局名称空间—>内置名称空间。

函数的嵌套:
函数在被调用的时候才执行;函数里面同样代码遵循从上至下依次执行;

5、作用域

作用域就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
全局作用域:包含内置名称空间、全局名称空间,在整个文件的任意位置都能被引用、全局有效。
局部作用域:局部名称空间,只能在局部范围内生效。

由作用域引申出两个函数方法globals()和locals()
例:

def func():
    a = 33
    b = 22
    print(locals())
    print(globals())

func()
c = 40
print(locals())

{'a': 33, 'b': 22}
{'__name__': '__main__', '__spec__': None, 'func': <function func at 0x0000000000755488>, '__builtins__': <module 'builtins' (built-in)>,
 '__cached__': None, '__file__': 'E:/Python/day10/笔记.py', '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x000000000066E048>, 
'__doc__': None, '__package__': None}

{'__file__': 'E:/Python/day10/笔记.py',
 '__name__': '__main__', '__spec__': None, 
'__builtins__': <module 'builtins' (built-in)>, 
'__doc__': None, 'c': 40, 
'__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x00000000009AE048>, 
'__cached__': None, '__package__': None, 
'func': <function func at 0x0000000000D85488>}


由上例可以看到,函数中locals存储的是{'a': 33, 'b': 22}

因为它的作用域是在局部命名空间中,所以它存储的变量和值并不多,而在函数之外再打印的locals就不同了,它的作用域扩大了,但是不包括局部,所以里面的值里可以找到’c’:40而找不到a,b的值。

在函数中使用locals()方法可以很方便返回在这个临时命名空间作用域中所有的变量的值,呈字典返回,所以还是有它常用到的地方的。

global关键字,nonlocal关键字:

global:
1、声明一个全局变量。
2、在局部作用域想要对全局作用域的全局变量进行修改时,需要用到global(限于字符串,数字)。

例:

a = 2
def func():
    a = 5
func()
print(a)  #这时候a返回的是2

a = 2
def func():
    global a
    a = 5
func()
print(a)  #使用了global后返回的是5

注:对可变数据类型(list,dict,set)可以直接引用不用通过global。

li = [1,2,3]
dic = {'a':'b'}

def change():
    li.append('a')
    dic['q'] = 'g'
    print(dic)
    print(li)
change()
print(li)
print(dic)

{'a': 'b', 'q': 'g'}
[1, 2, 3, 'a']
[1, 2, 3, 'a']
{'a': 'b', 'q': 'g'}

nonlocal:
  1、不能修改全局变量。
  2、在局部作用域中,对父级作用域(或者更外层作用域非全局作用域)的变量进行引用和修改,并且引用的哪层,从那层及以下此变量全部发生改变。

def add_b():
    b = 42
    def do_global():
        b = 10
        print(b)
        def dd_nonlocal():
            nonlocal b
            b = b + 20
            print(b)
        dd_nonlocal()
        print(b)
    do_global()
    print(b)

add_b()

10
30
30
42

【补充】:
python是用命名空间来记录变量的轨迹的,命名空间是一个dictionary,键是变量名,值是变量值。
当一行代码要使用变量 x 的值时,Python 会到所有可用的名字空间去查找变量,按照如下顺序:
1)局部名字空间 – 特指当前函数或类的方法。
如果函数定义了一个局部变量 x,
或一个参数 x,Python 将使用它,然后停止搜索。
2)全局名字空间 –
特指当前的模块。如果模块定义了一个名为 x 的变量,函数或类,Python 将使用它然后停止搜索。
3)内置名字空间 –
对每个模块都是全局的。作为最后的尝试,Python 将假设 x 是内置函数或变量。

python的全局名字空间存储在一个叫globals()的dict对象中;
局部名字空间存储在一个叫locals()的dict对象中。
我们可以用print (locals())来查看该函数体内的所有变量名和变量值。

end

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图