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 参数:返回值

原文地址:https://www.cnblogs.com/ltyandy/p/10973984.html