• Python基础2


    复习

    1 pyhton 第一行被执行的代码在哪里??

    python没有main函数,第一行被执行的代码,就是文件中的第一行代码

    2 python有哪些常用的数据类型??

    整型 浮点型 复数类型

    字符串:

    1 去掉某一种字符 strip/lstrip/rstrip

    2 切分 split

    3 查找子串 find

    4 获得某一个子串出现的次数 count

    5 将列表中的字符串拼接为一个 join

    6 判断是否以某一子串开头或者结尾 startswith endswith

    7 求字符个数 len

    8 可以进行切片操作

    被切片的对象[起始位置:结束位置:步长]

    位置可以是正数,也可以是负数

    正数的时候代表着从0开始的下标。负数的话,就倒着数的下标,注意:最后一个元素是-1.

     

    列表:可以认为是存储任意类型数据的动态数组

    li = []

    增:append 末尾 insert 任意位置

    删:pop 默认删除末尾,也可以根据下标进行删除 remove:根据元素删除

    改:通过下标运算符更改------[]

    查:index 查找元素所在的位置

    其他操作:

    排序: sort

    倒序:reverse

    元组:可以认为是存储任意类型数据的不可改变的数组

    基本的操作只有查询相关的的操作:

    index []

    count:统计某一个数据出现的次数

    元组不可以改变,说的是元组的元素不能再引用其他数据,但是如果元素的元素是一个列表,列表是可以改变的。

    li= (1,2,[1,2,3],4,5)
    li[2][1] = "hello world"
    print(li)
    字典:

    键值对

    什么可以作为键:整数 浮点 元组 字符串 列表不可以

    什么可以作为值:任意数据都可以作为值

    增:setdefault []

    删:del

    查:get

    改:[]

    3 python中的三大结构:

    选择结构:if-else if-elif-elif....else

    循环结构:

    while 和C/C++是一致的

    for in 通常用来遍历序列

    4 python中的函数:

    def 函数名(参数1名称,参数2名称.....):

    #函数体 如果暂时没有想好怎么写,可以用pass占位

    不需要返回值类型,也不需要参数类型 因为pyhton是弱类型,什么类型都可以传递,都可以返回。

    python中形参和实参的关系:

    形参是否能够改变实参????

    类似于 整数 浮点 元组啊 等等 都不能改变

    字典 列表 就可以改变

    大家以指针的思想去理解这个问题,就会比较好理解。存储任何数据都是存储此数据的地址。

     

    def  my_fun1(a):
      a = 20
    def my_fun2(a):
      a[1] = 10

    m = 100
    n= [1,2,3,4,5]
    my_fun1(m)
    my_fun2(n)

    print(m,n)

    深浅拷贝的问题:

    m = 100

    b = m
    print(hex(id(m)))
    print(hex(id(b)))

    n= [1,2,3,4,5]
    j = n.copy()
    print(hex(id(n)))
    print(hex(id(j)))

     

     

     

    函数的作用域问题:

    python中也有全局变量和局部变量:

    定义在函数外的变量是全局变量,定义在函数内的变量是局部变量。

    如果想在函数内使用全局变量的话,需要用global声明一下。

    函数的参数问题:

    1 python传参可以按位置传递,也可以按照关键字传(按照参数名传递)

    2 python支持默认参数

    3 python支持变参

    位置变参
    def calc_addition(*m):
      print(m)
      for i in m:
          print(i)

    calc_addition(1,2,3,"helloworld",[1,2,3],("nihao"))

     

     

     

     

    关键字变参
    def calc_addition(**m):
      print(m)
      for i in m:
          print(i)

    calc_addition(xiaoming = 1,xiaobai = 2,xiaohei = 3)

     

     

    如果一个函数定义为如下形式,那么任意参数都可以往里面传递了。
    def calc_addition(*args,**kwargs):
      print(args)
      print(kwargs)

    calc_addition(1,2,3,4,5,6,"nihao",day = 1,month = 12)

    模块管理:

    一个python文件,就称之为一个模块。

    如果你想要在自己的python文件中使用别的模块的函数,变量,那么就需要导入那个模块:

    import 模块名

    使用函数的时候,需要提供模块名

    import mymath

    print(mymath.add(1,2))

    form 模块名 import 符号名

    导入某一个符号

    from mymath import add
    print(add(1,2))

    form 模块名 import *

    导入所有的符号

    from mymath import *
    print(add(1,2))
    print(sub(10,20))

    导入模块的时候,会有三个事情:

    1 执行目标模块文件中的所有脚本

    2 构建一个命名空间,载入要导入的符号

    3 将符号可命名空间联系在一起、

     

    关于主模块的区分问题:

    每一个模块,都有一个属性:

    name

    在作为主模块运行的时候,数据是"main"

    作为导入模块运行的时候,数据是模块名

    所以一般用它来区分,当前的python脚本是否作为主模块运行:

    def add(a,b):
      return a+b

    def sub(a,b):
      return a-b

    if __name__ == "__main__":
      print("我在测试")

     

     

    包:就是一堆模块在一个文件夹中

    import shiwupai.my_file as haha
    from mymath import *

    haha.fun()

    python中的面向对象:

    class StudentInfo(object):
      count = 0 #这种属性是类属性

      def __init__(self,id,name,age):
          self.id = id     #这种属性叫做实例属性
          self.name = name
          self.age = age
          StudentInfo.count+=1
      def print_all_info(self):
          print(self.id,self.name,self.age)

    stu1 = StudentInfo(1,"xiaoming",18)
    stu2 = StudentInfo(2,"xiaohong",18)
    stu1.print_all_info()
    print(StudentInfo.count)
    无论是类属性还是实例属性,都是可以动态添加的。
    class StudentInfo(object):
      count = 0

      def __init__(self,id,name,age):
          self.id = id     #这种属性叫做实例属性
          self.name = name
          self.age = age
          StudentInfo.count+=1
      def print_all_info(self):
          print(self.id,self.name,self.age)
          self.abc = 125

    stu1 = StudentInfo(1,"xiaoming",18)
    stu1.address = "北京昌平"
    print(stu1.address)
    stu2 = StudentInfo(2,"xiaohong",18)
    stu1.print_all_info()
    print(StudentInfo.count)

     

     

    可以看出stu1的实例属性增多了。

    class StudentInfo(object):
      count = 0

      def __init__(self,id,name,age):
          self.id = id     #这种属性叫做实例属性
          self.name = name
          self.age = age
          StudentInfo.count+=1
      def print_all_info(self):
          print(self.id,self.name,self.age)

    StudentInfo.abc = 100
    print(StudentInfo.abc)

    类属性,也是可以动态添加的。

     

    函数:

    1 普通方法

    2 类方法

    class StudentInfo(object):
      count = 0
      Teacherlist = ["万","高","...."]
      def __init__(self,id,name,age):
          self.id = id     #这种属性叫做实例属性
          self.name = name
          self.age = age
          StudentInfo.count+=1
      def print_all_info(self):
          print(self.id,self.name,self.age)
      @classmethod
      def PrintAllTeacher(cls):
          for ele in cls.Teacherlist:
              print(ele)

    StudentInfo.PrintAllTeacher()

     

    3 静态方法

    class StudentInfo(object):
      count = 0
      Teacherlist = ["万","高","...."]
      def __init__(self,id,name,age):
          self.id = id     #这种属性叫做实例属性
          self.name = name
          self.age = age
          StudentInfo.count+=1
      def print_all_info(self):
          print(self.id,self.name,self.age)
      @classmethod
      def PrintAllTeacher(cls):
          for ele in cls.Teacherlist:
              print(ele)
      @staticmethod
      def Test():
          print(StudentInfo.Teacherlist)
          print("hello world")

    StudentInfo.PrintAllTeacher()
    StudentInfo.Test()

     

    类方法和静态方法没有本质的不同,只是使用习惯上的区别:

    1 类方法一般用于需要使用类属性的情况

    2 静态方法一般用于不需要使用类属性的情况。

     

    python中的权限控制要求:

    以单下划线开头(_)表明成员是保护属性

    以双下划线开头(__)表明成员是私有属性。

    但是以上的限定仅仅类似于一个约定俗成的规矩,并没有语法上的强制限制。

    双下划线开头()的成员是做了一个名称的变换:_类名成员名。

    还是可以访问到的。

     

    XXX:类似于这种的名称都是python内置的属性,我们定义成员名的时候,禁止使用这种形式。

    常见的__开头结尾的属性:

    print(StudentInfo.__name__)
    print(StudentInfo.__doc__)
    print(StudentInfo.__bases__)
    print(StudentInfo.__dict__)#所有的类属性
    print(StudentInfo.__module__)

     

     

     

    单下划线(_)开头的全局变量,全局的函数,不能够被import XXX from* 导入。

    python中的继承:

    子类拥有父类的所有成员及方法。

    class Human(object):
      def __init__(self,name ,age):
          self._name = name
          self._age = age
      def print_human_info(self):
          print(self._name,self._age)
    class StudentInfo(Human):
      count = 0
      Teacherlist = ["万","高","...."]
      def __init__(self,id,name,age):
          #从父类继承来的属性,用父类的构造
          super(StudentInfo,self).__init__(name,age)
          #自己扩展的属性再自己添加
          self.__age = age
          StudentInfo.count+=1
      def print_all_info(self):
          print(self.id,self.name,self.age)

    m = StudentInfo(2,"xiaoming",18)
    m.print_human_info() #子类对象能够直接使用父类的函数

    python支持多继承

    class Human(object):
      def __init__(self,name ,age):
          self._name = name
          self._age = age
      def print_human_info(self):
          print(self._name,self._age)
    class Wolf(object):
      def __init__(self, speed):
          self._speed = speed
      def run(self):
          print("da da da ")


    class WolfMan(Human,Wolf):
      def __init__(self, speed):
          super(WolfMan,self).__init__("xiaoming",18)
          self._speed = speed

    m = WolfMan(200)
    m.print_human_info() #子类对象能够直接使用父类的函数
    m.run()

    pyhton中解决二义性问题,就是广度优先遍历,先找到谁算谁。

    python中的多态:

    多态实现的是(接口复用)

    python是一种天然的支持多态的语言。因为是弱类型的。

    class Human(object):
      def __init__(self,name="xiaoming" ,age=18):
          self._name = name
          self._age = age
      def SingASong(self):
          print("la la la")
    class Wolf(object):
      def __init__(self, speed=200):
          self._speed = speed
      def SingASong(self):
          print("ao wu ao wu ")

    def StartSing(obj):
      obj.SingASong()

    m = Human()

    n = Wolf()

    StartSing(m)

    StartSing(n)

     

    python中的异常处理

    python中大多数错误在运行的时候都能够检测出来。

     

    try:
      li = [1, 2, 3, 4]
      li[4] = "hello world"
    except IndexError:
      print("越界了")

     

    自己将可能出现的异常并且需要自己处理的,就写在except后面。处理几个异常,就写几个except。

    对于需要清理的资源,清理代码可以写在finally中。

    try:

      a = 10
      #print(b)
    except IndexError:
      print("越界了")
    except NameError as info:
      print(info)
    finally:
      print("有没有出现异常,都会执行我这里")

    我们自己可以主动抛出异常:

    try:

      a = 10
      b = 0
      if b == 0:
          raise ZeroDivisionError("wei 0 le")
      c =a/b
    except IndexError:
      print("越界了")
    except NameError as info:
      print(info)
    except ZeroDivisionError as info:
      print(info)
    finally:
      print("有没有出现异常,都会执行我这里")

    python的一些特殊的语法:

    filter 能够根据你提供的规则 去过滤一个列表

    例如:提取列表中的偶数

    li = [213,21,321,4,435,45,56,7,657,51,34,123,43,4,45]

    li2 = []
    for i in li:
      if i%2==0:
          li2.append(i)
    print(li2)

    更为高级的方法:

    li = [213,21,321,4,435,45,56,7,657,51,34,123,43,4,45]
    def fun(num):
      if num%2==0:
          return True
      else:
          return False
    li2 = list(filter(fun,li))
    print(li2)

     

    li = [213,21,321,4,435,45,56,7,657,51,34,123,43,4,45]

    li2 = list(filter(lambda x:not (x%2),li))

    print(li2)

    reduce 能够将序列中的元素按照某一种规则,迭代的去运算。

    li = [1,2,3,4,5]

    def Add(a,b):
      return a+b
    resault = reduce(Add,li)
    print(resault)
    resault = reduce(lambda a,b:a+b,list(range(0,100)))
    print(resault)

    map 能够将序列中的元素按照某一种规则映射出一份新的列表

    li = [1,2,3,4,5]
    def Shift(a):
      return 2*a-1
    li2 = list(map(Shift,li))
    print(li2)

     

    li = [1,2,3,4,5]
    li2 = list(map(lambda a:a*2,li))
    print(li2)

    匿名函数:

    lambda 参数:返回值

  • 相关阅读:
    C#全角半角转换输出解决方法
    screen命令
    Parrot Linux国内源
    screen命令在freebsd安装和使用
    sysbench0.5 在 centos7下安装 (mysql-community-server)
    Mysql中文乱码问题完美解决方案
    PHP返回数据被nginx截断问题的解决方法
    yii2笔记:asset压缩js,css文件
    Yii2笔记:activerecord和activecontroller
    yii2笔记: 模块(module)
  • 原文地址:https://www.cnblogs.com/ltyandy/p/10973984.html
Copyright © 2020-2023  润新知