Python Knowledge

213 阅读5分钟

一、定义

Python是一种面向对象的解释型计算机程序设计语言,它常被昵称为胶水语言,能够把其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起.
面向对象:把构成问题的内容分解成多个对象,创建对象的目的不是为了完成一个步骤,而是描述某个事物在整个解决问题步骤中的行为.
面向过程:分析解决问题所有步骤并且使用函数将其一一实现.
解释型语言:代码逐行解释运行,在解释器中逐行解释给CPU运行.
编译型语言:编译成可执行文件运行,代码编译生成二进制文件.exe执行.

优点:

  • 语法简单,免费开源.
  • 可扩展性,丰富的第三方库.
  • 平台可移植性,代码规范. 缺点:
  • 运行速度较慢
  • 分享项目只能开放源代码,代码不能加密
  • 强制的缩进
  • GIL全局解释器锁,不能真正意义上的多线程,多个线程会在解释器触发阻塞.

二、例子

1. 过滤除去英文字母外的字符

import re

with open(r'D:\Coder\【2】 xlsx&thon\1.txt','r') as f:
    str = f.read()
    # re.findall 在字符串中找到正则表达式所匹配的所有子串,并返回一个列表,如果没有找到匹配的,则返回空列表.
    # findall(pattern, string)
    strfilter = re.findall('[a-z]|[A-Z]',str)
    with open(r'D:\Coder\【2】 xlsx&thon\2.txt','w') as g:
        g.write(''.join(strfilter))

open() 函数用于创建或打开指定文件,该函数的常用语法格式如下:

file = open('fileName'[,mode='r'])
模式意义注意事项
r只读模式打开文件,读文件内容的指针会放在文件的开头.操作的文件必须存在.
rb以二进制格式,采用只读模式打开文件,读文件内容的指针位于文件的开头,一般用于非文本文件,如图片文件、音频文件等.操作的文件必须存在.
r+打开文件后,既可以从头读取文件内容,也可以从开头向文件中写入新的内容,写入的新内容会覆盖文件中等长度的原有内容.操作的文件必须存在.
w以只写模式打开文件,该文件存在打开时会清空文件中原有的内容.若文件存在,会清空其原有内容(覆盖文件),反之,则创建新文件.
w+打开文件后,会对原有内容进行清空,并对该文件有读写权限.若文件存在,会清空其原有内容(覆盖文件),反之,则创建新文件.
a以追加模式打开一个文件,对文件只有写入权限,如果文件已经存在,文件指针将放在文件的末尾.反之,则会创建新文件.
a+以读写模式打开文件,如果文件存在,文件指针放在文件的末尾,反之,则创建新文件.

2. 装饰器

定义:可以在不修改原有代码的情况下,为被装饰对象增加新的功能.
首先定义一个函数:判断一个数是否为质数

def isPrimeNumber(num):
    if num <= 1:
        return False
    else:
        for i in range(2,num):
            if num%i == 0:
                return False
        return True

然后输出1-1000内的质数:

def primeNumber():
    for i in range(1,1000):
        if isPrimeNumber(i):
            print(i)

再不改变输出1-1000质数函数的情况下,记录程序运行时间,定义装饰器runtime并使用到primeNumber上:

import time

def runtime(func): # 装饰器的定义
    def wrapper():
        sta = time.time()
        func() # 函数无参无返回值
        end = time.time()
        print('TIMECOST:%fS'%(end-sta))
    return wrapper

def isPrimeNumber(num):
    if num <= 1:
        return False
    else:
        for i in range(2,num):
            if num%i == 0:
                return False
        return True

@runtime # 装饰器的调用
def primeNumber():
    for i in range(1,1000):
        if isPrimeNumber(i):
            print(i)

primeNumber()

函数primeNumber无参无返回值,如果函数有参有返回值,装饰器中需要接受参数,并把函数运行结果赋值在装饰器中返回.

import time

def runtime(func):
    def wrapper(*args):
        sta = time.time()
        rlt = func(*args) # 函数有参有返回值
        end = time.time()
        print('TIMECOST:%fS'%(end-sta))
        return rlt
    return wrapper

def isPrimeNumber(num):
    if num <= 1:
        return False
    else:
        for i in range(2,num):
            if num%i == 0:
                return False
        return True

@runtime # 装饰器的调用
def primeNumber(maxNum):
    count = 0
    for i in range(1,maxNum):
        if isPrimeNumber(i):
            count += 1
    return count

print(primeNumber(10000))

使用场景:为函数新增功能,解决重复性操作,使得代码简洁不冗余模块化.

3. 对列表去重的方式

  • 循环去重法
listV = list(map(int,input().split(',')))
# map(function, iterable, ...) python3.x返回一个迭代器,python2.x返回列表.
newlist = []

for x in listV:
    if x not in newlist:
        newlist.append(x)
        
print(newlist)
  • set去重法
listV = list(map(int,input().split(',')))
newlist = list(set(listV))
newlist.sort(key=listV.index) # 解决输出结果无序问题.
# list.sort( key=None, reverse=False),该方法没有返回值,但是会对列表的对象进行排序.
# key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序.

print(newlist)
  • 利用dict属性
listV = list(map(int,input().split(',')))
newdict = {}.fromkeys(listV)
# dict.fromkeys(seq[, value]),该方法返回一个新字典.
# seq -- 字典键值列表.
# value -- 可选参数,设置键序列(seq)的值.
newlist = list(newdict)

print(newlist)

4. 反转字符串的方式

  • 切片
str = 'abc'
strver = str[::-1] # 切片[start:end]左闭右开
# str[start:end:step],切片的返回结果类型和切片对象一致,返回的是切片对象的子序列.
# start:起始索引 end:结束索引 step:步长 step的正负决定了切片结果的元素采集的先后.

print(strver)
  • 列表的reverse()方法
str = 'abcd'
lstr = list(str)
lstr.reverse()
# list.reverse(),该方法没有返回值,会对列表的元素进行反向排序.

print(''.join(ls))
  • 列表推导式
str = 'abcd'
strver = ''.join([str[-x] for x in range(1,len(str)+1)])

print(strver)

5.统计字符串个数并按照数字个数从大到小排序

str = input('请输入字符:')

# 存放字符+个数
dt = {}

# 遍历字符串统计个数
for x in str:
    if x not in dt.keys():
        dt[x] = 1
    else:
        dt[x] += 1

# 遍历字符串统计个数
for x in str:
	dt[x] = dt.get(x,0)+1

dtSorted = sorted(dt.items(),key = lambda x:x[1],reverse=True)

print(dtSorted)

6. 打印直角三角形

  • while循环


7. 二分查找

def binarySearch(nums, target):