Python学习笔记(相比静态语言的一些不同之处)

Python相比其他静态语言的一些不同之处

先说说什么是动态语言和静态语言

动态语言的定义:动态编程语言是高级程序设计语言的一个类别,它是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。动态语言目前非常具有活力。众所周知的ECMAScript(JavaScript)便是一个动态语言,除此之外如PHP、Ruby、Python等也都属于动态语言。
而静态语言是在编译时变量的数据类型即可确定的语言,多数静态类型语言要求在使用变量之前必须声明数据类型。 如JAVA,C/C++.

通过在学习中的一些实例来简要说明python和静态语言的一些不同之处。

有很多好用的高阶函数

map、reduce、filter、sorted等高阶函数(https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014317852443934a86aa5bb5ea47fbbd5f35282b331335000%20%E2%80%9C%E5%BB%96%E9%9B%AA%E5%B3%B0%E8%80%81%E5%B8%88%E7%9A%84python%E6%95%99%E7%A8%8B%E4%B8%AD%E6%9C%89%E8%AF%A6%E7%BB%86%E7%9A%84map%E7%AD%89%E9%AB%98%E9%98%B6%E5%87%BD%E6%95%B0%E6%95%99%E7%A8%8B%E2%80%9D) 这里不做具体讲解。
针对很多问题,可以用简单的代码实现,而不需要繁琐的循环等操作。

对于类的操作更加方便

正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性
在静态语言中就无法做到,必须事先定义好类的各个变量和函数。
举例:

class Student(object):
    pass
>>> s = Student()
>>> s.name = 'Michael' # 动态给实例绑定一个属性
>>> print(s.name)
Michael

还可以给实例绑定方法:

>>> def set_age(self, age): # 定义一个函数作为实例方法
...     self.age = age
...
>>> from types import MethodType
>>> s.set_age = MethodType(set_age, s) # 给实例绑定一个方法
>>> s.set_age(25) # 调用实例方法
>>> s.age # 测试结果
25

给实例绑定的方法在另一个实例中无法使用,如果想在每一个实例中都能够使用新加的方法,就可以给类绑定方法。这在静态语言中是无法做到的。

class Student():
    pass


def set_score(self, score):
     self.score = score

 Student.set_score = set_score

给classs类绑定方法后,所有的实例便都可以调用。

补充

python类中的访问限制没有c++,java那么严格,不需要在变量之前加privat等标识,如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线,在Python中,实例的变量名如果以开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问

class Student(object):

    def __init__(self, name, score):
        self.__name = name
        self.__score = score

    def print_score(self):
        print('%s: %s' % (self.__name, self.__score))

这样就无法通过实例直接访问,

f1=Student('tom',90), 
print(f1.__name)  //报错,提示该实例不存在__name变量

想要获取就需要调用内部函数。可以给Student类增加get_name这样的方法:

class Student(object):
    ...

    def set_score(self, score):
        self.__score = score

需要注意的是,在Python中,变量名类似xxx的,也就是以双下划线开头,并且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不能用namescore这样的变量名。

有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗成的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问,但是,请把我视为私有变量,不要随意访问”。

双下划线开头的实例变量是不是一定不能从外部访问呢?其实也不是。不能直接访问__name是因为Python解释器对外把__name变量改成了_Student__name,所以,仍然可以通过_Student__name来访问__name变量:

总的来说,python没有很好的保护机制来阻止你访问隐藏变量,这一点静态语言就做的更好,在python里,就要靠自觉,所以静态语言动态语言各有优势,如果先前学习过c/c++或java,再学习python会比较好理解,而且各种操作也会变得更加简便,python就是简化了很多复杂的事情,不需要注意太多细节,的确是一门很不错的语言。

你可能感兴趣的:(学习体会)