python基础知识

目录

1.arg、*args、**kwargs三个参数区别

2. 执行 Python 程序时,自动生成的 .pyc 文件的作用是什么?

3.元组与列表的区别

4. Python数组和列表有什么区别?

5.什么是python模块?Python中有哪些常用的内置模块?

6. Python中的局部变量和全局变量是什么?

7. 什么是Python中的类型转换?

8.什么是__init__?

9.什么是lambda函数?

10.Python中的self是什么?

11. 什么是python迭代器?

12.python中的生成器是什么?

13. Python中help()和dir()函数的用法是什么?

14.Python中的字典是什么?

15. 如何在python中使用三元运算符?

16.如何将值添加到python数组?

17.如何删除python数组的值?

18. 如何在Python中实现多线程?

19.深拷贝和浅拷贝有什么区别?

20.普通字段与静态字段

21.装饰器

22.类方法和静

目录

1.arg、*args、**kwargs三个参数区别

2. 执行 Python 程序时,自动生成的 .pyc 文件的作用是什么?

3.元组与列表的区别

4. Python数组和列表有什么区别?

5.什么是python模块?Python中有哪些常用的内置模块?

6. Python中的局部变量和全局变量是什么?

7. 什么是Python中的类型转换?

8.什么是__init__?

9.什么是lambda函数?

10.Python中的self是什么?

11. 什么是python迭代器?

12.python中的生成器是什么?

13. Python中help()和dir()函数的用法是什么?

14.Python中的字典是什么?

15. 如何在python中使用三元运算符?

16.如何将值添加到python数组?

17.如何删除python数组的值?

18. 如何在Python中实现多线程?

19.深拷贝和浅拷贝有什么区别?

20.普通字段与静态字段

21.装饰器

22.类方法和静态方法

23类、类方法、类对象、实例

24.python的特点:封装、继承、多态

25.新式类和旧式类

26.字典与json的区别

27.yeild

28.Python中open()一个文件但是没有close()会怎么样?


态方法

23类、类方法、类对象、实例

24.python的特点:封装、继承、多态

25.新式类和旧式类

26.字典与json的区别

27.yeild


1.arg、*args、**kwargs三个参数区别

*args 用来将参数打包成tuple给函数体调用

 **kwargs 打包关键字参数成dict给函数体调用

参数arg、*args、**kwargs三个参数的位置必须是一定的。必须是(arg,*args,**kwargs)这个顺序,否则程序会报错。

def function(arg,*args,**kwargs):

    print(arg,args,kwargs)

function(6,7,8,9,a=1, b=2, c=3)

    输出结果:

                  

2. 执行 Python 程序时,自动生成的 .pyc 文件的作用是什么?

.pyc 是编译py文件后的二进制文件,用于加速运行

  •   Python的执行过程:先编译成字节码,然后再解释执行
  •   .pyc文件的作用是提高下次的执行效率
  •   .py和.pyc文件都可以交给解释器直接处理,只是处理步骤不太一样

3.元组与列表的区别

  1. 元组与列表相似,但是元组的元素不能修改(不可变),列表可变;
  2. 列表是有序的,元组是无序的。

4. Python数组和列表有什么区别?

Python中的数组和列表具有相同的存储数据方式。但是,数组只能包含单个数据类型元素,而列表可以包含任何数据类型元素。

5.什么是python模块?Python中有哪些常用的内置模块?

Python模块是包含Python代码的.py文件。此代码可以是函数类或变量。一些常用的内置模块包括:sys、math、random、datatime、JSON。

6. Python中的局部变量和全局变量是什么?

全局变量:在函数外或全局空间中声明的变量称为全局变量。这些变量可以由程序中的任何函数访问。

局部变量:在函数内声明的任何变量都称为局部变量。此变量存在于局部空间中,而不是全局空间中。

7. 什么是Python中的类型转换?

类型转换是指将一种数据类型转换为另一种数据类型。如:str()

8.什么是__init__?

__init__是Python中的方法或者结构。

两个下划线开头的函数是声明该属性为私有,不能在类的外部被使用或访问。

__init__函数(方法)支持带参数类的初始化,也可为声明该类的属性(类中的变量)。__init__函数(方法)的第一个参数必须为self,后续参数为自己定义。

在创建类的新对象/实例时,将自动调用此方法来分配内存。所有类都有__init__方法。

1、__init__ 方法的第一个参数永远是 self,表示创建的实例本身,因此,在 __init__ 方法的内部,就可以把各种属性绑定到 self,因为 self 就指向创建的 实例本身

2、使用了 __init__ 方法,在创建实例的时候就不能传入空的参数了,必须传入与 __init__ 方法匹配的参数,但是 self 不需要传,python解释器会自己把实例变量传进去

3. __init__()这个特殊的方法就可以方便地自己对类的属性进行定义,__init__()方法又被称为构造器(constructor)

9.什么是lambda函数?

lambda函数也叫匿名函数,该函数可以包含任意数量的参数,但只能有一个执行操作的语句。

10.Python中的self是什么?

self是类的实例或对象。

Python类中规定,函数的第一个参数是实例对象本身,并且约定俗成,把其名字写为self

self代表类的实例,而非类;self 就是 对象/实例 属性集合

在Python中,self包含在第一个参数中。但是,Java中的情况并非如此,它是可选的。它有助于区分具有局部变量的类的方法和属性。

init方法中的self变量引用新创建的对象,而在其他方法中,它引用其方法被调用的对象。

11. 什么是python迭代器?

迭代器是可以遍历或迭代的对象。

迭代是python中访问集合元素的一种非常强大的一种方式。迭代器是一个可以记住遍历位置的对象,因此不会像列表那样一次性全部生成,而是可以等到用的时候才生成,因此节省了大量的内存资源。迭代器对象从集合中的第一个元素开始访问,直到所有的元素被访问完。迭代器有两个方法:iter()和next()方法。

创建一个可迭代的对象:只要此对象含有__iter__方法,那么它就是一个可迭代的对象

12.python中的生成器是什么?

我们知道我们可以用列表储存数据,可是当我们的数据特别大的时候建立一个列表的储存数据就会很占内存的。这时生成器就派上用场了。它可以说是一个不怎么占计算机资源的一种方法。

返回可迭代项集的函数称为生成器。

生成器不是使用return返回一个值,而是可以生成多个值,每次一个。每次使用yield生成一个值后,函数都将被冻结,等待重新被唤醒,被重新唤醒后,函数将从停止的地方继续执行。

13. Python中help()和dir()函数的用法是什么?

Help()和dir()这两个函数都可以从Python解释器直接访问,并用于查看内置函数的合并转储。

help()函数:help()函数用于显示文档字符串,还可以查看与模块,关键字,属性等相关的使用信息。

dir()函数:dir()函数用于显示定义的符号。比如新式类和旧式类可以使用dir()来查看定义的

14.Python中的字典是什么?

Python中的内置数据类型称为字典。它定义了键和值之间的一对一关系。字典包含一对键及其对应的值。字典由键索引。

15. 如何在python中使用三元运算符?

三元运算符是用于显示条件语句的运算符。这包含true或false值,并且必须为其评估语句。其基本语法为:

三元运算符是用于显示条件语句的运算符。这包含true或false值,并且必须为其评估语句。其基本语法为:

[on_true] if [expression] else [on_false] x,y = 25,50big = x if x <y else y

16.如何将值添加到python数组?

可以使用append(),extend()和insert(i,x)函数将元素添加到数组中。

17.如何删除python数组的值?

可以使用pop()或remove()方法删除数组元素。这两个函数之间的区别在于前者返回已删除的值,而后者则不返回。

18. 如何在Python中实现多线程?

Python有一个多线程库,但是用多线程来加速代码的效果并不是那么的好,

Python有一个名为Global Interpreter Lock(GIL)的结构。GIL确保每次只能执行一个“线程”。一个线程获取GIL执行相关操作,然后将GIL传递到下一个线程。

虽然看起来程序被多线程并行执行,但它们实际上只是轮流使用相同的CPU核心。

所有这些GIL传递都增加了执行的开销。这意味着多线程并不能让程序运行的更快

19.深拷贝和浅拷贝有什么区别?

在创建新实例类型时使用浅拷贝,并保留在新实例中复制的值。浅拷贝用于复制引用指针,就像复制值一样。这些引用指向原始对象,并且在类的任何成员中所做的更改也将影响它的原始副本。浅拷贝允许更快地执行程序,它取决于所使用的数据的大小。

深拷贝用于存储已复制的值。深拷贝不会将引用指针复制到对象。它引用一个对象,并存储一些其他对象指向的新对象。原始副本中所做的更改不会影响使用该对象的任何其他副本。由于为每个被调用的对象创建了某些副本,因此深拷贝会使程序的执行速度变慢。

 浅拷贝可以使用列表自带的copy()函数(如list.copy()),或者使用copy模块的copy()函数。深拷贝只能使用copy模块的deepcopy(),所以使用前要导入:from copy import deepcopy

  如果拷贝的对象里的元素只有值,没有引用,那浅拷贝和深拷贝没有差别,都会将原有对象复制一份,产生一个新对象,对新对象里的值进行修改不会影响原有对象,新对象和原对象完全分离开。

  如果拷贝的对象里的元素包含引用(像一个列表里储存着另一个列表,存的就是另一个列表的引用),那浅拷贝和深拷贝是不同的,浅拷贝虽然将原有对象复制一份,但是依然保存的是引用,所以对新对象里的引用里的值进行修改,依然会改变原对象里的列表的值,新对象和原对象完全分离开并没有完全分离开。而深拷贝则不同,它会将原对象里的引用也新创建一个,即新建一个列表,然后放的是新列表的引用,这样就可以将新对象和原对象完全分离开。

20.普通字段与静态字段

字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,

•普通字段属于对象

•静态字段属于类

class Province:

    # 静态字段

    country = '中国'

    def __init__(self, name):

        # 普通字段

        self.name = name

# 直接访问普通字段

obj = Province('河北省')

print(obj.name)

# 直接访问静态字段

Province.country

# 【普通字段需要通过对象来访问】【静态字段通过类访问】

# •静态字段在内存中只保存一份

# •普通字段在每个对象中都要保存一份

21.装饰器

python装饰器就是用于拓展原来函数功能的一种函数,这个函数的特殊之处在于它的返回值也是一个函数,使用python装饰器的好处就是在不用更改原函数的代码前提下给函数增加新的功能。

比如,当我们需要给原来的代码添加日志记录时,需要将原来的代码进行修改,在函数里面增加日志记录的代码。但如果使用装饰器模式,使用装饰器装饰原来的代码,将日志记录放在装饰器里,就可以避免修改原有的代码,同时又实现了所需的功能。这种编程模式就叫做面向切片编程。

Python为装饰器也提供了一个语法糖,就是 @ 符号。我们可以使用这个符号声明这是一个装饰器。

class Dog(object):

    def __init__(self, name):

        self.name = name

    @property

    def eat(self):

        print(" %s is eating" % self.name)

d = Dog("ChenRonghua")

# d.eat()

d.eat

# d.eat()应该改为d.eat

# @property使eat的接口发生了改变

"""

python的@property是python的一种装饰器,是用来修饰方法的。

我们可以使用@property装饰器来创建只读属性,

@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。

"""

class DataSet(object):

    @property

    def method_with_property(self):  # 含有@property

        return 15

    def method_without_property(self):  # 不含@property

        return 15

l = DataSet()

print(l.method_with_property)  # 加了@property后,可以用调用属性的形式来调用方法,后面不需要加()。

print(l.method_without_property())  # 没有加@property , 必须使用正常的调用方法的形式,即在后面加()

22.类方法和静态方法

class A(object):

   
def foo(self, x):
       
print("executing foo(%s, %s)" % (self, x))

   
@classmethod
   
def class_foo(cls, x):
       
print("executing class_foo(%s, %s)" % (cls, x))

   
@staticmethod
   
def static_foo(x):
       
print("executing static_foo(%s)" % x)


a = A()


# classmethod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数
# (即便是对象来调用也会将类当作第一个参数传入

# classmethod,绑定到类的方法
a.class_foo('绑定到类'# 输出结果:executing class_foo(<class '__main__.A'>, 绑定到类)
A.class_foo('绑定到类'# 输出结果:executing class_foo(<class '__main__.A'>, 绑定到类)

#
在类内部用staticmethod装饰的函数即非绑定方法,就是普通函数, statimethod不与类或对象绑定,谁都可以调用,没有自动传值效果

# staticmethod 静态方法
a.static_foo('静态绑定'# 输出结果:executing static_foo(静态绑定)
A.static_foo('静态绑定'# 输出结果:executing static_foo(静态绑定)

"""
1.
使用@staticmethod目的之一是为了增加可读性,不需要参数self的方法都可以加上@staticmethod增加可读性,因为,这个方法是类级别的,在调用时要使用类名。
2.使用@classmethod是为了处理一些__init__处理不了的赋值问题(一般是参数不对应),你可以当成,有第二,第三个__init__方法,当然它要通过类名显示调用

类方法和静态方法都是用类直接调用的,都可以不进行实例化就可以做相关操作
对象也可以调用类方法和静态方法(指针指向类),但是一般推荐使用类名调用
类方法有一个默认参数
cls,代表这个类
静态方法没有默认参数,像函数一样

"""

23类、类方法、类对象、实例

# Java和C#来说只支持面向对象编程,而python比较灵活即支持面向对象编程也支持函数式编程

# 类就是一个模板,模板里可以包含多个函数,函数里实现一些功能

# 对象则是根据模板创建的实例,通过实例对象可以执行类中的函数

# 类中定义的函数叫做 “方法”

# 根据类Foo创建对象obj

# 创建对象,类名称后加括号即可

  类----->通过实例化生成----对象---->(对象只是一串类似于字典的数据,没有把类的里的方法复制给你,python没有new这个方法!

24.python的特点:封装、继承、多态

封装

1.封装是面向对象编程的一大特点

2.面向对象编程的第一步,将属性和方法封装到一个抽象的类中

3.外界使用类创建对象,然后让对象调用方法

4.对象方法的细节都被封装在类的内部

同一个类创建的多个对象之间,属性互补干扰

继承:实现代码的重用,相同的代码不需要重复的写

单继承

1.继承的概念:子类拥有父类的所有属性和方法(子类只需要封装自己特有的方法)

2.语法

class 类名(父类):

def 子类特有的方法

在子类的对象方法中,不能访问父类的私有属性

.在子类的对象方法中,不能调用父类的私有方法

多继承

可以让子类对象,同时具有多个父类的属性和方法

开发时存在父类同名的属性或者方法,应该尽量避免使用多继承

# 多态: 不同子类对象 调用相同的 父类方法,产生不同的执行结果

# 多态可以增加代码的灵活度

# 以 继承 和 重写父类方法 为前提

# 是调用方法的技巧,不会影响到类的内部设计

25.新式类和旧式类

# 新式类:以object为基类

# 经典类(旧式类):不以object为基类

# 新式类和旧式类在多继承时 --会影响到继承的顺序

class A(object):

    pass

class B:

    pass

# 创建对象

a = A()

b = B()

# python3,a,b一样,这是由于python3在定义类时,如果没有指定父类,会默认使用object作为类的基类。

# python3.x中定义的类都是 新式类

print(dir(a))

print(dir(b))

# python2 需要使用object来定义新式类

"""

In [1]: class A:

   ...:     pass

   ...: a = A()

   ...: dir(a)

   ...:

Out[1]: ['__doc__', '__module__']

In [2]: class B(object):

   ...:     pass

   ...: b = B()

   ...: dir(b)

   ...:

Out[2]:

['__class__',

 '__delattr__',

 '__dict__',

 '__doc__',

 '__format__',

 '__getattribute__',

 '__hash__',

 '__init__',

 '__module__',

 '__new__',

 '__reduce__',

 '__reduce_ex__',

 '__repr__',

 '__setattr__',

 '__sizeof__',

 '__str__',

 '__subclasshook__',

 '__weakref__']

"""

26.字典与json的区别

python中,json和dict非常类似,都是key-value的形式,而且json和dict也可以非常方便的通过dumps和loads互转,但是它们之间还是有区别的:

json:是一种数据格式,是纯字符串。可以被解析成python的dict或其他形式。

dict:是一个完整的数据结构,是对hash table这一数据结构的实现,是一套从存储到提取都封装好的方案。它使用内置的hash函数来规划key对应的value的存储位置,从而获得O(1)的数据读取速度。

字典是一种数据结构,而json是一种数据格式,

格式就会有一些形式上的限制,比如json的格式要求必须且只能使用双引号作为key或者值的边界符号(值如果是数字可以不用加双引号),不能使用单引号,用单引号或者不用引号会导致读取数据错误,而且“key”必须使用边界符(双引号),但字典就无所谓了,可以使用单引号,也可以使用双引号。

json和dict对比:

1)json的key只能是字符串,dict的key可以是任何可hash的对象,例如:字符串、数字、元组等。

2json的key可以是有序、重复的;dict的key不可重复

3)json的value只能是字符串、浮点数、布尔值或者null,或者它们构成的数组或者对象;

4)json任意key存在默认值undefined,dict默认没有默认值;

5)json访问方式可以是[],也可以是.,遍历方式分in,of; dict的value仅仅可以下标访问;

6)json的字符串强制用双引号,dict的字符串可以用单引号、双引号;

7)dict可以嵌套tuple,json里只有数组

8)json:true、false、null

9)dict:True、False、None

10)json中文必须是unicode编码,如“\u6211”

11)json的类型时字符串,字典的类型是dict

27.yeild

包含yeild语句的函数都被称为生成器

28.Python中open()一个文件但是没有close()会怎么样?

会导致写入的数据没有保存,不过你可以在每次写入数据之后加上 ,flush(),对写入的数据进行保存,这样即使最后没有close(),也不会导致之前的数据未保存

1 数据丢失,缓冲区没有满之前不会写入文件中。

2 文件句柄被占用,多线程或者进程情况下 会造成文件写入错乱,造成脏数据。

3 对象未解除引用,垃圾回收无法回收此对象占用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值