Python-Day1(Python基础)

177 阅读5分钟

数据类型与一些注意点

python是动态语言。和静态语言的区别在于前者在运行时确定数据类型(无需声明类型),后者在编译时就确定数据类型(如java)。动态语言更灵活,静态语言更安全

  • 整数相除是精确值。想要得到整数可以用//
  • 字符串单双引号都可以,转义用\
  • print默认换行,想不换行可以这样print('不换行',end='')
  • 用and表示&&,用or表示||
  • 以缩进来替代了c++与java 的括号功能,实现逻辑控制
  • 空值表示:None
  • `a='a' b=a`这两行代码表示:创建字符串a,变量a指向字符串。变量b也指向字符串。

字符串相关

字符串处理往往常见又容易忘,特此整理

字符编码

  1. 最开始的ASCII码占1个字节。
  2. 涉及到中文或其他语言需要其他编码方式,于是出现了各种各样的标准。
  3. Unicode出现统一各种语言的编码,占2字节
  4. UTF-8出现优化Unicode的所占空间,ASCII码是UTF-8编码的子集哦

python3默认以Unicode编码。

常见字符串处理

#ord()与chr()
# 这样类似C++的方式是不对的
a ='1'
b=a-'0'+1
#应该这样:ord函数获取字符的整数表示,chr函数把编码转换为对应的字符
a ='1'
b = ord(a)-ord('0')
c = chr(b+ord('0'))

# 或者用更简单的类型转换
a= '1'
b=int(a)
print(b+1)
print(str(b))

#len()
len('中文') # 统计字符数
len('中文'.encode('utf-8')) #编码后的是bytes类型的(byte数组?),统计的是字节数

# 输出格式
print('%2d %02d' % (3, 1))
print('%.2f' % 3.1415926)

# 待增加

数据结构

列表list

类比vector。索引从0开始,-i表示倒数第i个

# 列表a = ['a',1,['1',2]]
print(len(a))
# 末尾增删
a.append(3)
a.pop()
# 指定索引增删
a.insert(0,'ADD')
a.pop(0)
#切片
b= a[:3] #索引0到索引3,不包括3
b = a[-2:] #倒数第二个到索引0,不包括0
#列表生成式(range(1,11)表示1-10a= [x*x for x in range(1, 11) if x%2==0] #if作过滤
a= [m + n for m in 'ABC' for n in 'XYZ'] # 全排列
a= [x if x % 2 == 0 else -x for x in range(1, 11)] # if在前面作映射

tuple元组

不可变list(指引用不可变,指向列表时,列表本身可以变。元组要想完全不可变,需要里面的每个元素本身不可变)

# 元组
a = (1,'a',[1,2],(3,4))
print(len(a))
# ,结尾消除歧义
b = (1) # 表示的1这个数而不是元组
b = (1,)
# 不可变理解
a[1]=2  # 报错
a[2][0]=2 # 元组中的列表第一个元素变为2
#转换为list
b=list(a)

dict字典

key必须是不可变对象。内部存储并不按存入的逻辑顺序

# dict
d = {'a':1,'b':'c',2:'d'}
# 判断key是否存在
if 'a' in d :    
    print('exist')
# 赋值与获取
d['a']=2
print(d['a']) #不存在则会报错
print(d.get('k')) #不存在则返回None
print(d.get('k','self_define')) #不存在则返回自定义的
# 删除
d.pop('a')

set集合

#set
s = {1, 1, 2, 3}
print(s)
# 增删
s.add(4)
s.remove(1)
# 集合操作
s2 = {0,2}
var1 = s & s2  #交集
var2 = s | s2  #并集

函数

函数参数与返回值

多返回值: 返回的是元组,可以用多个参数接收

def f(a,b):
    return a,b
x,y = f (1,2)

默认参数:传入时可以少传参数

def f(a,b=2):    
    return a,b
x,y = f (1)print(y)

可变参数:加*,接收的是一个元组

def f(*num):   
  return num[0]
#直接传数字
k=f(1,2,3)
#如果本来定义好了,则这样传
l=[1,2,3]
k=f(*l)

关键字参数:加**,接收dict

def f(**num):    
    return num['b']
d={"a":1,"b":2}
k=f(**d)

命名关键字参数: 看着有点鸡肋,感兴趣可以看廖雪峰博客

map/reduce/filter

与spark,以及java里的stream是类似的操作。map和filter操作会返回一个迭代器。

  • map:做映射

    def f(x):    
        return x+x
    b=list(map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
    
  • reduce:做聚合,下面是做了累加

    #reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
    from functools import reducede
    f f(a,b):    
        return a+b
    b=reduce(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
    
  • filter:做过滤,下面过滤了偶数

    def is_odd(n):
        return n % 2 == 1
    
    list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
    

闭包:函数返回值为函数

内部函数可以引用外部函数的参数和局部变量

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum
f1=lazy_sum(1,2,3)
f2=lazy_sum(1,2,3)
f1()

注意点:

  • 返回的f1为函数,执行f1()时才真正执行逻辑

  • 返回的f1与f2时不同的

  • 由于最后再执行,所以返回函数中不要引用任何可能会变化的变量,如下:

    def count():
        fs = []
        for i in range(1, 4):
            def f():
                 return i*i
            fs.append(f)
        return fs
    
    f1, f2, f3 = count() #最后函数执行结果都为9,因为i已经变成3了
    

lambda函数(匿名函数)

即用lambda表达式来表示函数。冒号前面为入参,后面为return的值。改写map如下:

b=list(map(lambda x:x+x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))

函数名

函数也是对象。

def my_name():   
    print("name")
# 函数对象赋值给变量f
f = my_name()
f()
#获取名字
print(my_name.__name__)
print(f.__name__)

偏函数(用的少)

使用functools.partial可以创建一个新的函数,这个新函数可以固定住原函数的部分参数,从而在调用时更简单。

import functools
int2 = functools.partial(int, base=2)
int2('1000000')
#原来需要 int('1000000',2):2进制的转换为int

生成器

生成器:可以简单地把列表生成式改成generator,也可以通过函数实现复杂逻辑的generator。有函数next()。hasnext()。一般用for循环

# 列表生成式的[],改为()。就变成了生成器
g = (x * x for x in range(10))
# 函数实现:整个函数返回的就是生成器
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
f = fib(10)   #  每次yield相当于往迭代器放入一个元素

排序

sort+sorted;如何自定义排序(python3不再支持cmp)

#sorted不改变原列表
b = [36, 5, -12, 9, -21]
a=sorted(b, key=abs)
print(b)
#sort改变原列表
b.sort(key=abs)
print(b)

# 按一列递增,另一列递增排序。lamda的方式无法实现自定义递减(是数字可以加个负号实现)
student = [['Jack', 'A', 18], ['Jack', 'C', 20], ['Andy', 'B', 11]]
student.sort(key=lambda student: (student[0],student[2]))
print(student)
# 按一列递增,另一列递减排序。自定义函数
import  functools
def cmp(x,y):    
   if(x[0]>y[0]):       
     return 1    
   if (x[0] < y[0]):        
     return -1       
   if(x[2]>y[2]):            
     return -1        
   if (x[2] < y[2]):           
     return 1        
   return 0
student = [['Jack', 'C', 18], ['Jack', 'A', 20], ['Andy', 'B', 11]]
student.sort(key=functools.cmp_to_key(cmp))
print(student)
# b=sorted(student,key=functools.cmp_to_key(cmp))