zoukankan      html  css  js  c++  java
  • Python——脚本(calculator)

    《Python基础教程》(第二版) P123

      书中原代码如下:

     1 class Calculator:
     2     def calculator(self,expression):
     3         self.value = eval(expression) #eval()是一个函数
     4 
     5 class Talker:
     6     def talk(self):
     7         print "hi,my value is" ,self.value
     8 
     9 class TalkingCalculator(Calculator,Talker):
    10     pass

      然后在代码行输入:

      >>tc = TalkingCalculator()

      >>tc.calculator('1+2*3')

      >>tc.talk()

      输出:hi,my value is 7

      改成脚本后的代码如下:

     1 #!/usr/bin/env python
     2 #coding=TUF8
     3 
     4 class Calculator:
     5     def calculator(self,expression):  #函数定义()中都是逗号‘,’
     6         self.value = eval(expression) #eval()是一个函数
     7 
     8 class Talker:
     9     def talk(self):
    10         print "hi,my value is" ,self.value
    11 
    12 class TalkingCalculator(Calculator,Talker):
    13     pass
    14 
    15 tc = TalkingCalculator()
    16 tc.calculator('1+2*3')    #输入的是字符串
    17 tc.talk()

      本例中:

        1.注意到在tc.calculator('1+2*3')输入的字符串而不是数字,返回结果是数字。

          原因是eval()是一个函数——eval参数是一个字符串,可以把这个字符串当成表达式来求值。不管输入是什么形式,表达式都必须为字符串即带引号(' ')

             eval()函数可以对数字,字母,字符串,列表,元组进行操作,对字典的操作有限制。

            例如:

    >>> a = {'a': 'am',b:'baby'}        #字符串要加引号(‘’)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'b' is not defined
    
    >>> a = {'a': 'am','b':'baby'}
    >>> eval(a)        #eval()括号中表达式必须是字符串(带引号‘’)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: eval() arg 1 must be a string or code object
    
    >>> eval('a')
    {'a': 'am', 'b': 'baby'}
    >>> x = {'a': 'am','b':'baby'}
    >>> eval(x)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: eval() arg 1 must be a string or code object
    
    >>> eval('x')
    {'a': 'am', 'b': 'baby'}
    >>> y = eval('x')
    >>> y
    {'a': 'am', 'b': 'baby'}
    >>> m = {'c':'crumb'}
    >>> eval('x+m')        #字典不可以相加
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<string>", line 1, in <module>
    TypeError: unsupported operand type(s) for +: 'dict' and 'dict'
    
    >>> x = 1
    >>> y = 2
    >>> eval('x+y')        #数字可以
    3
    
    >>> x = 'a'
    >>> y = 'b'
    >>> eval('x+y')        #字符串可以(字母可以)
    'ab'
    
    >>> x = ['a','b']        
    >>> eval('x')
    ['a', 'b']
    >>> y = ['c','d']
    >>> eval('x+y')        #列表[ ]可以
    ['a', 'b', 'c', 'd']
    
    >>> x = ('a','b')
    >>> eval('x')
    ('a', 'b')
    >>> y = ('c','d')
    >>> eval('x+y')       #元组( )可以 
    ('a', 'b', 'c', 'd')
    
    >>> x = 'hello'        
    >>> y = 'world'
    >>> eval('x+y')        #字符串可以
    'helloworld'

    >>> A = 1
    >>> eval('A+1')
    2
    >>> eval('A == 1')   #可以进行判断
    True
    >>> eval('A == 0')
    False

      其他有关eval函数的参考:www.tuicool.com/articles/BBVnQbq

      参数self:只在类中有,单独的def脚本没有self

          类(class)初始化之后会得到实例(instance)。self就是用于代表初始化的到的实例。
          明确地写一个self参数,使得类的方法(method)和普通的函数(function)本质上没有差异,所有的输入参数都显示地传递到方法/函数当中。
            当然作为类的方法,作用的对象一定会是实例,因而在Python的设计之初,完全可以设计成self不作为一个参数,但是那样就需要一个关键字代表实例,比如在javascript中就是this。
          然而Python的哲学是"Explicit is better than implicit.",显示要比隐示好,因此Python类的方法需要一个self参数代表实例是符合逻辑的。

        如下脚本:如下代码中就没有self  

     1 #!/usr/bin/env python
     2 #!coding=UTF8
     3 """
     4 fibs = [0,1]
     5 for i in range(8):
     6     fibs.append(fibs[-2]+fibs[-1])
     7 print fibs
     8 """
     9 
    10 fibs = [0,1]
    11 num = input('what is you num:')
    12 for i in range(num-2):
    13 #    fibs = [0,1]
    14     fibs.append(fibs[-2]+fibs[-1])
    15 print fib
  • 相关阅读:
    2021昆明站K-Riichi!!(麻将)
    数据结构 Week 3 --- dsu on tree 和 点分治
    数据结构 Week 2 --- 平衡树
    数据结构 Week 1 --- 从线段树到主席树
    一些思维题(三)
    一些思维题(二)
    2021ICPC昆明站总结及补题
    2021ICPC昆明M题 非主席树做法
    2020ICPC昆明参赛
    记5.28leetcode简单题
  • 原文地址:https://www.cnblogs.com/zhuzhu2016/p/5514977.html
Copyright © 2011-2022 走看看