Python常用基础知识点

举报
泽宇-Li 发表于 2020/09/18 08:24:54 2020/09/18
【摘要】 Python基础环境搭建Python的运行环境从官网下载相应版本,下载安装anaconda,下载使用docker安装pypy,官网Python包管理直接使用pip使用conda使用虚拟环境使用景象加速(https://pypi.tuna.tsinghua.edu.cn/simple)创建一个stenv目录,然后进入到stenv目录创建虚拟环境python3 -m venv .激活虚拟环境so...

Python基础

环境搭建

Python的运行环境

Python包管理

  • 直接使用pip

  • 使用conda

  • 使用虚拟环境

  • 使用景象加速(https://pypi.tuna.tsinghua.edu.cn/simple)

创建一个stenv目录,然后进入到stenv目录
创建虚拟环境
python3 -m venv .
激活虚拟环境
source bin/activate #windows中直接执行activate.bat
这虚拟环境就创建完成
退出虚拟环境
终端执行命令:deactivate123456789

将Python运行起来

  • 使用终端

  • 直接作为脚本

  • 在编译器运行

  • 打包为可执行程序 (pyinstaller -F source)

基础语法

快速入门

'''
基本命名方式
module_name,  模块
package_name,  包
ClassName,  类 驼峰
method_name,  方法
ExceptionName,   异常
function_name,  函数 下划线
GLOBAL_VAR_NAME, 全局变量
instance_var_name,  实例
function_parameter_name,   参数
local_var_name.  本变量
'''

"""
关键字
and	exec	not
assert	finally	or
break	for	pass
class	from	print
continue	global	raise
def	if	return
del	import	try
elif	in	while
else	is	with
except	lambda	yield
"""

#基本变量

a = 3
b = 3.5
c = "hello"
d = ['1',123,3.5]

#条件判断,使用4个空格缩进,不使用tab
if a == 3:
    print("a is 3")
else:
    print("a is not 3")

#循环
for i in range(3):
    print(i)

#函数
def add(a,b):
    """
    实现两个数相加
    :param a: 加数
    :param b: 被加数
    :return: 返回相加结果
    """
    return a + b

#类
class StMath(object):
    """
    实现数学计算的类
    """
    def __init__(self,a_in):
        """
        初始化方法
        :param a_in: 初始化数值
        """
        super().__init__()
        self.a = a_in

    def add(self,B):
        """
        实现两个math对象相加
        :param B: 被加math对象
        :return: 相加结果
        """
        return StMath(self.a + B.b)123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475

基本类型

数字类型

高精度!高精度!高精度!重要的事说三遍

字符串

基本操作

#增删改查

content = "abcxabcyabc"

print(content+"123")
print(content[:2]+content[4:])
print(content.replace("abc","python"))
print(re.sub("abc","python",content)) #使用正则表达式替换
print(content.find("xyz",2)) #或"xyz" in content
print(re.findall("abc",content))123456789101112

编码问题

python3中,文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes,正是这使得两者的区分特别清晰。你不能拼接字符串和字节包,也无法在字节包里搜索字符串

一个乱码问题演示

"你好".encode("utf-8").decode("gbk")
#str,bytes再一个事例
"你好".encode("unicode-escape").decode()
ord('你')12345

List

list具有范型特征(讲完对象再回顾排序)

#增删改查
a = [1,2,3,4,5,6,7]
#增加元素
a.append(8)
#删除元素
a.remove(3)
#查找元素
a.index(6)
#修改元素
a[4] = 10
#切片操作,会忽略结束元素
a[2:5] #注意不会包括索引5的元素
a[::-1] #反序操作

#便利操作
for v in a:
	print(v)

#如果属性要索引
for i,v in enumerate(a):
    print(i,v)1234567891011121314151617181920212223

字典

#增删改查
stu_dict = {"name":"jack","age":21,"s**":100}
#增加
stu_dict["phone"] = "18000000000"
#删除
del stu_dict["phone"]
#修改
stu_dict["name"] = "lucy" #stu_dict.update({})
#查询
stu_dict.get("name") #和stu_dict["name"]区别1234567891011

使用函数

函数是python的一等公民,变为:

  • 运行时创建

  • 能赋值

  • 能传参

  • 能返回

函数的参数

不可变对象

str,int,number都是不可变对象,采用值传递

a = 20

def change_value(x):
    x = 100

change_value(a)
print(a) #结果仍然是201234567

可变对象

list,dict是可变对象,采用引用传递

def change_list(x):
    x.append(20)

y = [1,2,3]
change_list(y)
print(y) # 结果是1,2,3,201234567

定位参数和关键字参数

定位参数必须按照次序,关键字参数可以任意打乱次序,可以赋默认值

def extract_content(tag_name,start_pos = 20)
		print("tag_name is ::::::",tag_name)12

*args, **karges

使用args和kargs传入不定长参数,args捕获的定位参数被组织为元组,kargs捕获的参数被组织为字典

def extract_content(*args,**kargs):
    print(args)
    print(kargs)

extract_content("a",3.5,[1,2,3],name="jack",age="22")123456

数组加上*号传入会被args解包后逐个捕获

list_args = [1,2,3,4,5,6]
extract_content(*list_args)123

函数的注解

可以给参数和返回值附加元数据,对于复杂数据支持的时候可以提高易读性,提升开发效率,Python自身不做检查不做校验,不会对程序的行为产生影响,仅仅是一种约定

def add(add_a:int,add_b:int) -> int:
    return add_a + add_b

print(add(10,20))1234

变量的作用阈

全局作用域与局部作用域

#下面的代码错在什么地方?使用global纠正
m = 10
def show_diff():
    print("********show_diff*********")
    global
    n = 20
    print(m)
    m = 90
    print(n)12345678910

函数和闭包

#函数和闭包
def create_sum():
    sum = 0
    def sum_all(a_in):
        nonlocal sum
        sum += a_in
        return sum
    return sum_all

s_custom = create_sum()
#本质是什么
#print(s_custom.__closure__[0].cell_contents)
print(s_custom(10))
print(s_custom(20))
print(s_custom(30))12345678910111213141516

如何做为一等公民?

可以赋值

p = add
print(p(10,20))12

可以作为参数传递(linux,spring设计)

def download_url(url_str,extract_rule):
    print("下载了某个网页")
    result = "<html><head><a href='//www.baidu.com'></a></head></html>"
    urls = extract_rule(result)
    print("页面的所有地址是:",urls)

def normal_url_rule(result):
    return re.findall("<a\s+href=\'(.*?)\'",result)

def no_http_url_rule(result):
    origin_url = re.findall("<a\s+href=\'(.*?)\'",result)
    return ["http:"+ url for url in origin_url]

download_url("",no_http_url_rule)123456789101112131415

做为返回值

def math_rule():
    def rule(a,b):
        return a+b

    return rule


rule = math_rule()
print(rule(20,30))123456789

装饰器

装饰器的本质,函数的嵌套调用

import time

#装饰器
def download_html():
    time.sleep(1)
    print("执行了下载操作")



def record_time(download_func):
    def record_wrapper():
        start_time = time.time()
        download_func()
        end_time = time.time()
        print("下载经过了时间",end_time - start_time)
    return record_wrapper


decorate_download = record_time(download_html)
decorate_download()123456789101112131415161718192021

使用语法糖,更直观的使用体验:

@record_time
def download_html():
    time.sleep(1)
    print("执行了下载操作")


download_html()1234567

装饰器中传递参数:

def record_time(level):
    def decorate(download_func):
        def record_wrapper(*args,**kargs):
            print("下载网址是:",args)
            print("日志等级是",level)
            start_time = time.time()
            download_func()
            end_time = time.time()
            print("下载经过了时间",end_time - start_time)
        return record_wrapper
    return decorate


@record_time(level=9)
def download_html():
    time.sleep(1)
    print("执行了下载操作")1234567891011121314151617

面向对象

面向对象的基本特点,封装、继承、多态,抽象用来设计类的层次结构

面向对象基础

self,方法重写,@classmethod @staticmethod,内置方法重写

class Person(object):
    """
    定义抽象基类
    """
    def __init__(self,score):
        self.score = score
        self.__name = "jack" #加上两个下划线,表示私有方法

    @classmethod
    def from_file(cls,file_name):
        """
        从文件读取学生成绩
        :param file_name: 文件名
        :return:
        """
        score = open("score.txt").read()
        return cls(score)

    @staticmethod
    def extract_address():
        return "no.90"

    def run(self):
        print("person run!!!!")


    def __add__(self, other):
        return Student(self.score + other.score)


class Student(Person):
    """
    学生信息类
    """
    def __init__(self,score):
        super().__init__(score)

    def ask(self):
        print("ask a question!!")

    def run(self):
        super().run()
        print("student run!!",self.score)

# p = Person(85)
# p.run()

s = Student.from_file("test.txt")
print(Student.extract_address())
s.run()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051

抽象层构建

抽象基类中的抽象方法必须在子类中实现,否则子类无法实例化。

#抽象接口
from abc import ABC,abstractmethod

class Person(ABC):
    """
    定义抽象基类
    """
    def __init__(self):
        pass

    @abstractmethod
    def run(self):
        pass

class Student(Person):
    def __init__(self):
        super().__init__()

    def ask(self):
        print("ask a question!!")

    def run(self):
        print("run run run1!!")1234567891011121314151617181920212223

动态特性

运行过程中动态判断属性,设置属性,可以结合配置文件灵活实现类的加载,修改

  • hasattr

  • setattr

  • hasattr

package = __import__('st_python_base')
student_class = getattr(package,'Student')

s = student_class(90)
s.run()12345

当出现未知访问属性的时候,进行处理

 def __getattr__(self, item):
         print('getattr')12

内存管理

关于引用计数

import weakref
def over():
    print("student is over!!!")
    
x = st_python_base.Student(10)
ender = weakref.finalize(x,over)

y = x123456789

关于深复制和浅复制

注意直接赋值,copy,deepcopy的区别?

from copy import copy
from copy import deepcopy

class Student(object):

    def __init__(self):
        self.course = [1,2,3,4,5]
        self.name = "jack"


s1 = Student()
s2 = deepcopy(s1)

s1.course.append(12)
print(s2.course)123456789101112131415

上下文管理

with…as…的本质

class StTools(object):

    def __enter__(self):
        print("进入上下文块。。。。")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("从上下文块退出")

    def make_sign(self):
        print("test!!!")



with StTools() as st:
    st.make_sign()12345678910111213141516

关于迭代器和生成器

理解yield和send

def s():
    print('begin test')
    a = yield 10
    print(a)
    b = yield 20
    print('end test!')


【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。