Python - 基础

Python中的传参即不是传值也不是传地址,传的是对象的引用

Python人称胶水语言,强大之处是是当各种编程语言的装接口

集成开发环境(IDE,Integrated Development Environment)

是用于提供程序开发环境的应用程序,包括代码编辑器、编译器、调试器和图形用户界面等工具.集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套.

扎实的面向对象编程思维,具备模块化编程的思维与经验,熟悉Git;

为什么要设置环境变量?

就像切菜需要刀,环境变量是在操作系统中一个具有特定名称的对象,它包含一个或多个应用程序所将使用的信息。

我们通过一个具体的应用场景来理解:毫无疑问,想要运行一个软件,我们必须知道其启动程序程序的位置,同样的在命令行输入一个命令,计算机需要知道命令所在位置,否则会提示没有此命令.

win+R打开“运行”,是我们常用的应用。当我们输入“notepad”打开记事本程序时,操作系统会去环境变量已保存的路径中查找是否存在notepad程序。如果没有配置好环境变量,我们就必须告诉操作系统绝对路径:”C:\Windows\notepad”

Python常见异常

Import Error:无法引入模块或包;

Index Error:下标索引超出序列边界;

Name Error:使用一个还未赋予对象的变量;

Syntax Error:代码逻辑语法出错,不能执行;

Type Error:传入的对象类型与要求不符;

Value Error:传入一个不被期望的值,即使类型正确;

Key Error:试图访问字典里不存在的键;

IO Error:输入输出异常;

Python中还有其它一些内置的异常,比如ZeroDivisionError和OSError;

第三方库也可以定义自己的异常;

命名空间:在Python中,所有的名字都存在于一个空间中,它们在该空间中存在和被操作——这就是命名空间.它就好像一个盒子,每一个变量名字都对应装着一个对象.当查询变量的时候,会从该盒子里面寻找相应的对象;

字典推导式、列表推导式:可以创建字典和列表的语法结构;

列举3条以上PEP8编码规范

PEP是PythonEnhancementProposal的缩写,翻译过来就是Python增强建议书;PEP8是一个编程规范,内容是一些关于如何让让你的程序更具可读性的建议.

1、不要在一句import中多个库,比如importos,sys不推荐

2、顶级定义之间空两行,比如函数或者类定义.方法定义、类定义与第一个方法之间,都应该空一行

3、三引号进行注释;逗号、冒号、分号前不要加空格.

4、4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格

WSGI:(Python Web Server Gateway Interface)服务器网关接口

是Python应用程序或框架和Web服务器之间的一种接口

Python Paste – WSGI底层工具集,包括多线程,SSL和基于Cookies, sessions等的验证(authentication)库,可以用Paste方便搭建自己的Web框架。

WSGI区分为两个部分:一为“服务器”或“网管”,另一为“应用程序”或“应用框架”。在处理一个WSGI请求时,服务器会以应用程序提供环境信息及一个回调函数(Callback Function)。

python3 和python2的区别?

1、打印 python3 用括号()

2、range()函数,python3 返回的是迭代器

3、python3 使用 utf-8, python2使用ascii

4、python3 中使用 input()函数,python2 使用 raw_input()函数

5、python3中str表示字符串序列,byte表示字节序列

遇到bug如何处理

1、细节上的错误,通过print()打印,能执行到print()说明一般上面的代码没有问题,

分段检测程序是否有问题,如果是js的话可以alert或console.log

2、如果涉及一些第三方框架,会去查官方文档或者一些技术博客.

3、对于bug的管理与归类总结,一般测试将测试出的bug用teambin等bug管理工具进行记

录,然后我们会一条一条进行修改,修改的过程也是理解业务逻辑和提高自己编程逻辑缜密

性的方法,我也都会收藏做一些笔记记录.

4、导包问题、城市定位多音字造成的显示错误问题

提高python运行效率的方法

1、使用生成器,因为可以节约大量内存

2、循环代码优化,避免过多重复代码的执行

3、核心模块用CythonPyPy等,提高效率

4、多进程、多线程、协程

5、多个ifelif条件判断,可以把最有可能先发生的条件放到前面写,这样可以减少程序判断

的次数,提高效率

GIL锁,线程全局锁(Global Interpreter Lock)

Python为了保证线程安全而采取的独立线程运行的限制,规定就是一个核只能在同一时间运行一个线程.对于io密集型任务,python的多线程起到作用,但对于cpu密集型任务,python的多线程几乎占不到任何优势,还有可能因为争夺资源而变慢.

解决办法就是多进程和下面的协程(协程也只是单CPU,但是能减小切换代价提升性能).

GIL是python的全局解释器锁,同一进程中假如有多个线程运行,一个线程在运行python程序的时候会霸占python解释器(加了一把锁即GIL),使该进程内的其他线程无法运行,等该线程运行完后其他线程才能运行.如果线程运行过程中遇到耗时操作,则解释器锁解开,使其他线程运行.所以在多线程中,线程的运行仍是有先后顺序的,并不是同时进行.多进程中因为每个进程都能被系统分配资源,相当于每个进程有了一个python解释器,所以多进程可以实现多个进程的同时运行,缺点是进程系统资源开销大.

每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码.

Python使用多进程是可以利用多核的CPU资源的.

多线程爬取比单线程性能有提升,因为遇到IO阻塞会自动释放GIL锁.

解释型和编译型编程语言

解释型:就是边解释边执行;

编译性:编译后再执行

编码规范

7.什么是PEP8?
8.了解Python之禅么?
9.了解docstring么?
10.了解类型注解么?
11.例举你知道Python对象的命名规范,例如方法或者类等
12.Python中的注释有几种?
13.如何优雅的给一个函数加注释?
14.如何给变量加注释?
15.Python代码缩进中是否支持Tab键和空格混用.
16.是否可以在一句import中导入多个库?
17.在给Py文件命名的时候需要注意什么?
18.例举几个规范Python代码风格的工具

三元运算

三元运算又称三目运算,是对简单的条件语句的简写(简化if语句).是一种比较Pythonic的学法,形式为:

if a > b:
    max = a;
else:
    max = b;
    
# 更简洁的写法
max = a if a>b else b

问号前边是判断条件,如果判断条件是对的(true),那么打印冒号前边的值.如果判断条件是错(false),那么打印冒号后面的值.优点是这样可以大大缩短代码量.缺点就是必须有一个参数接收程序的结果.

排序 去重排序

sort和sorted

li = [0, -1, 3, 4, 2, 7]
li.sort()  # list.sort()对原始序列进行排序,仅支持list(本身就是list的一个方法)
print(li)
lii = [2, 3, 6, -1, 4, 9]
res = sorted(lii)  # 产生一个新的列表,sorted()适用于任何可迭代容器
print(res)  # Python中更高级的排序基本使用sorted()

[-1, 0, 2, 3, 4, 7]
[-1, 2, 3, 4, 6, 9]

去重排序

s = "rqteetqrtqey"
s = set(s)  # 去重
s = list(s)  # 转list
s.sort()  # 排序
print(s)
s.sort(reverse=True)
print(s)

# ['e', 'q', 'r', 't', 'y']
# ['y', 't', 'r', 'q', 'e']

简述any()和all()方法

any():只要迭代器中有一个元素为真就为真

all():迭代器中所有的判断项返回都是真,结果才为真

python中什么元素为假?答案:(0,空字符串,空列表、空字典、空元组、None,False)

if for while语句

if 的使用

_username = 'dsl'
_password = 'abc123'
username = input("username:")
password = input("password:")
if _username == username and _password == password:
    print("Welcome user {name} login..".format(name = username))
else:
    print("Invalid username or password !")

for 的使用

for i in range(0, 10):
    if i<3:
        print("loop", 1)
    else:
        continue
        print("hehe")

while 的使用

count = 0
while True:
    print("count:", count)
    count = count + 1
    if count == 100:
        break

with用法

提供了with语句来管理资源关闭,比如可以吧打开的文件放在with语句中,这样with语句就会帮我们自动关闭文件.使用with语句读取文件:

import codecs
with codecs.open("readline_test.py", 'r', 'utf-8', buffering=True) as f:
    for line in f:
        print(line, end='')

使用with语句来处理通过fileinput.input合并的多个文件:

import fileinput
with fileinput.input(file=('text.txt', 'info.txt')) as f:
    for line in f:
        print(line, end='')

两个程序都使用了with语句来管理资源,因此他们都不需要显示关闭文件.

python编程中对于文件的打开方式主要有以下两种:

列表[1,2,3,4,5],请使用map()函数输出[1,4,9,16,25],并使用表推导式提取出大于10的数,最终输出[16,25]

map()函数第一个参数是fun,第二个参数是一般是list,第三个参数可以写list,也可以不写,根据需求

list = [1, 2, 3, 4, 5]
def fn(x):
    return x**2
res = map(fn, list)
res = [i for i in res if i > 10]
print(res)

# [16, 25]

pass语句

Pass是一个在Python中不会被执行的语句.在复杂语句中,如果一个地方需要暂时被留白,它常常被用于占位符;如果想定义一个空函数,什么都不做,可以用pass语句:

def mop():
    pass

pass语句在这里什么都不做,只是一个占位符;如果现在还没有想好怎么写函数的代码,就可以在这里放一个pass,可以让程序运行起来。比如pass还可以放在下面这样的表达结构中:

if num > 10:
    pass

如果缺少pass,代码运行就会错误

Python pass 是空语句,是为了保持程序结构的完整性。

pass不做任何事情,一般用做占位语句。

for letter in "Python":
    if letter == 'h':
        pass
        print('这是 pass 块')
    print('当前字母:', letter)
print("Good bye!")
当前字母: P
当前字母: y
当前字母: t
这是 pass 块
当前字母: h
当前字母: o
当前字母: n
Good bye!

构造器:构造器是实现迭代器的一种机制.它功能的实现依赖于yield表达式,除此之外它跟普通的函数没有两样;

模块、包:在Python中,模块是搭建程序的一种方式.每一个Python代码文件都是一个模块,并可以引用其他的模块,比如对象和属性;

filter方法

求出表所有奇数并构造新表,a=[1,2,3,4,5,6,7,8,9,10]

filter()函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表.该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回True或False,最后将返回True的元素放到新列表

a = [1,2,3,4,5,6,7,8,9,10]
def fn(n):
    return n%2 == 1
newlist = filter(fn, a)
newlist = [i for i in newlist]
print(newlist)

# [1, 3, 5, 7, 9]

表推导式求表所有奇数并构造新表,a=[1,2,3,4,5,6,7,8,9,10]

a = [1, 2,3,4,5,6,7,8,9,10]
a = [i for i in a if i%2!=0]  # 非偶数
print("filter奇数组表结果:", a)

# filter奇数组表结果:[1, 3, 5, 7, 9]

lambda表达式

答:lambda表达式其实就是一个匿名函数,在函数编程中经常作为参数使用.例子如下

sum = lambda a, b: a*b
print(sum(5, 4))

# 精简代码,lambda省去了定义函数,map省去了写for循环过程
a = ["苏州", "中国", "哈哈", "", "", "日本", "", "", "德国"]
res = list(map(lambda x:"填充值" if x =="" else x, a))
print(res)

# ['苏州', '中国', '哈哈', '填充值', '填充值', '日本', '填充值', '填充值', '德国']

读文件:read、readline、readlines

read():每次读取整个文件,它通常用于将文件内容放到一个字符串变量中.

readline():一行一行的输出,该方法会把文件的内容加载到内存,所以对于对于大文件的读取操作来说非常的消耗内存资源;

readlines:将文件的句柄生成一个生产器,然后去读就可以了.

写文件:w、a+、wb

w表示写模式支持写入字符串,如果文件存在则覆盖.

a+和w的功能类型相似,不过如果文件存在的话内容不会覆盖而是追加.

wb是写入二进制字节类型的数据.

int("1.4"),int(1.4)输出结果?

int("1.4")报错,int(1.4)输出1

实现斐波那契数列

答:斐波那契数列:数列从第3项开始,每一项都等于前两项之和.

# 实现斐波那契而数列
def fibonacci(num):
    a, b = 0, 1
    l = []
    for l in range(num):
    a, b = b, a+b
    l.append(b)
return l
if __name__ == '__main__'
    print(fibonacci(10))

代码中*args,**kwargs含义及用法.

在函数定义中使用*args和**kwargs传递可变长参数.

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

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

*args,**kwargs:如果我们不确定要往函数中传入多少个参数,或者我们想往函数中以列表和元组的形式传参数时,那就使要用*args;如果我们不知道要往函数中传入多少个关键词参数,或者想传入字典的值作为关键词参数时,那就要使用**kwargs;

*args:(表示的就是将实参中按照位置传值,多出来的值都给args,且以元祖的方式呈现)

def foo(x, *args):
    print(x)
    print(args)
foo(1, 2, 3, 4, 5)

# 1
# (2, 3, 4, 5)

**kwargs:(表示的就是形参中按照关键字传值把多余的传值以字典的方式呈现)

def foo(x,**kwargs):
    print(x)
    print(kwargs)
foo(1, y=1, a=2, b=3, c=4)

# 1
# {'y':1, 'a':2, 'b':3, 'c':4}

如何在一个函数内部修改全局变量

Python中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域

简述乐观锁和悲观锁

悲观锁,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁.传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁.

乐观锁,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制,乐观锁适用于多读的应用类型,这样可以提高吞吐量

避免转义给字符串加哪个字母表示原始字符串?

r,表示需要原始字符串,不转义特殊字符

统计字母和单词

统计字符每个字母出现的次数

# 统计字符串每个单词出现的次数
from collections import Counter
a = "sqwfwwqswesqwsqwq"
res = Counter(a)
print(res)
Counter({'w': 6, 'q': 5, 's': 4, 'f': 1, 'e': 1})

统计字符串每个单词出现的次数

from collections import Counter
str = "i can because i think i can"
counts = Counter(str.split( ))
print(counts)
Counter({'i': 3, 'can': 2, 'because': 1, 'think': 1})

猜你喜欢

转载自www.cnblogs.com/qingaoaoo/p/12344801.html
今日推荐