Python基础学习(2)基本数据类型、三元运算、深浅拷贝、函数式编程、参数、变量、lambda表达式、python内置函数、文件处理、上下文管理、递归、命名空间、闭包

1. 基本数据类型

1)数字

(1)int类型

常用功能:

.__add__()

bit_length()获取可表示的二进制的最短位数


2)字符串,str类型,一次性创建,不能被修改,只要修改就需要再创建

常用方法:

a = 'bob'

(1)capitalize(),首字母大写

a.capitalize

(2)center,居中显示,第一个参数为位数,第二个参数为填充符号(默认为空格)

a.center(20,'*')

(3)count,字符串中某字符出现的次数,第一个参数指定查找的字符,第二个参数为查找起始位置,第三个参数为查找的终止位置

a.count('b',0,3)

(4)endswith,是否以某结尾,第一个参数指定查找的字符,第二个参数为查找起始位置,第三个参数为查找的终止位置

a.endswith('b')

(5)expandtabs,将tab转化成空格

a = 'hello\t999'

a.expandtabs()

(6)find,寻找子序列位置,如果没找到,返回-1

a.find('lo')

(7)format,字符串格式化,动态参数

"hello {0}, age {1}".format('Bob',19)

(8)index,子序列位置,如果没找到,报错

a = 'hello world'

a.index('w')

(9)isalnum,判断是否是字母和数字

a.isalnum('Abc')

(10)isalpha,判断是否是字母

a.isalpha()

(11)isdigit,判断是否是数字

a.isdigit()

(12)islower,判断是否小写

a.islower()

(13)isspace,判断是否空格

(14)isupper,判断是否大写

(15)istitle,判断是否标题

(16)join,连结

name_list=['Alex','Eric']

s = ' '.join(name_list)

(17)ljust,内容左对齐,右侧填充

(18)lower,变小写

(19)lstrip,移除左侧空白

(20)rstrip,移除右侧空白

(21)replace,替换

a.replace('a','El')

(22)rfind,从右向左找

(23)rindex,从右向左找

(24)rjust,内容右对齐,左侧填充

(25)split,分割,第二个参数可以指定最多分割几次

a.split('e')

(26)rstrip,移除右边空白

(27)startswith,是否以某开始

(28)strip,移除两段空白

(29)swapcase,大写变小写,小写变大写

(30)title,将字符串转换成标题

(31)upper,变为大写

(32)zfill,返回指定长度的字符串,原字符串右对齐,前面填充

(33)索引

a[2]

(34)切片

a[0:2]

(35)长度,len()

(36)字符 =》字节

bytes_list = bytes("字符串",encoding='utf-8')

print(bytes_list) #默认每个字节都是16进制表示

for b in bytes_list:

print(b) # 默认每个字节都是10进制表示


10进制的数字=》2进制

bin(10进制的数字)



3)列表,list

name_list = ['Steve','Bill','John']

(1)索引

name_list[0]

(2)切片

name_list[0:2]

(3)len长度

name_list[2:len(name_list)]

(4)for循环

for i in name_list:

print(i)

(5)append追加元素

name_list.append('Jobs')

(6)count统计某个元素出现的次数

name_list.count('Jobs')

(7)extend,扩展列表

name_list.extend(temp_list)

(8)index,获取某个值的索引

name_list.index('John')

(9)insert,在某个位置插入一个值

name_list.insert(1,'Nash')

(10)pop,拿到最后一个值并赋给新值

name_list.pop()

(11)remove,移除从左找到的第一个某元素

name_list.remove('Steve')

(12)reverse,将列表反转

name_list.reverse()

(13)sort,将列表排序

name_list.sort()

(14)del,删除某个索引下的元素

del name_list[1]



4)字典,dict,每个元素都是键值对

user_info = {'name':'Steve', ‘age’:25, ‘gender’:'M'}

(1)索引

user_info['name']

(2)循环

for i in user_info:

print(i)

(3)键值对

user_info.keys()

user_info.values()

user_info.items()

for key, val in user_info.items():

print(key + ":" + val)

(4)clear,清除所有内容

user_info.clear()

(5)get,根据key获取值,如果key不存在,可以制定一个默认值

user_info.get('nation','unknown')

(6)has_key,检查字典中指定key是否存在

user_info.has_key('age')

(7)pop,获取并在字典中移除

user_info.pop('age')

(8)setdefault,如果key不存在,则创建,如果存在,则返回已存在的值且不修改

user_info.setdefault('nation','UK')

(9)update,批量更新

test = {'language':'English','phone':'13123231441'}

user_info.update(test)

(10)del,删除

del user_info('phone')

(11)enumerate,自动生成键值对形式,key默认自增,从0开始

li = [‘CPU’,'Memory','Driver','Screen']

for key,item in enumerate(li):

print(key,item)

(12)range,指定范围,生成指定的数字,还可以指定步幅

for i in range(1,10,2):

print(i)

for i in range(10,1,-2):

print(i)

(13)fromkeys,从某个字典选某些keys,并指定value,生成一个新的字典


5)集合,不允许重复,可以用来去重

s = set()

(1)add,添加元素

s.add('Steve')

(2)difference,找前A中存在的,B中不存在的元素

s1 = (11,22,33)

s2 = (22,55,33)

s1_remain = s1.difference(s2) # 留下11

s2_remain = s2.difference(s1) # 留下55

(3)difference_update,从当前集合中删除和B中相同的元素

s1 = (11,22,33)

s2 = (22,55,33)

s1_remain = s1.difference_update(s2) # 留下11

(4)clear,清空

s.clear()

(5)discard,移除指定元素,不存在不报错

s.discard()

(6)remove,移除元素

s.remove('Steve)

(7)intersection,取交集

(8)intersection_update,取交集并更新到A中

(9)isdisjoint,如果没有交集,返回True,否则返回False

(10)issubset,是否是子序列

(11)issuperset,是否是父序列

(12)pop,移除元素,并返回该元素

(13)symmetric_difference,取并集

(14)symmetric_difference_update,取并集并更新



2. 三元运算(又名三目运算)

name = 值1 if 条件 else 值2

name = 'Steve' if 1 == 1 else 'Bill'


3. 深浅拷贝,数字和字符串不管怎么拷贝都是同一份

import copy

n1 = 123

1)浅拷贝,只拷贝了外面的一层,指向你n1的内存地址空间

n2 = copy.copy(n1)

2)深拷贝,除了最后一层都拷贝

n3 = copy.deepcopy(n1)


4. 函数式编程

1)定义函数

def 函数名(形式参数):

函数体

return 值

2)return返回值

注意:函数在执行过程中只要遇到return语句,就会停止执行并返回结果;如果未在函数中指定return,那这个函数的返回值为None


例,发送邮件的函数:

def email():

    flag = True

    try:

        import smtplib

        from email.mime.text import MIMEText

        from email.utils import formataddr

        msg = MIMEText('Email Message','plain','utf-8')

        msg['From'] = formataddr([‘Steve’,'[email protected]'])

        msg['To'] = formataddr(['Bill','[email protected]'])

        msg['subject'] = 'Test Email'



        server = smtplib.SMTP(''smtp.126.com",25)

        server.login('[email protected]','123456')

        server.sendmail('[email protected]',['[email protected]',], msg.as_string())

        server.quit()

    except:

        flag = False

return flag

3)嵌套函数

def fun1():
    print('alex')
    def func2():
        print('eric')

(1)函数内部可以再次定义函数

(2)执行需要被调用


4)匿名函数

def calc(x,y):
    return x * y

func = lambda x,y: x*y # 声明一个匿名函数
print(func(3,5))

print(list(map(lambda x: x*x, list(range(10)))))

特点:

(1)节省代码量

(2)看起来高大上


5)高阶函数

只要满足以下任意一个条件,即是高阶函数

(1)接受一个或多个函数作为输入

(2)return返回另外一个函数



5. 参数

1)形参,实参(默认,按照顺序) 

指定形参传入实参,可以不按照顺序


2)默认参数(有默认值的参数一定要放在所有参数的尾部)

def enroll(name, age, nationality='China')


3)关键参数,指定了参数名的参数就叫关键参数,但关键参数必须放在位置参数之后

def enroll(name, age, nationality='China')

stu_1 = enroll('Alex', nationality='USA, age = 22)


4)动态参数,非固定参数

(1) *args,将参数变为元组

def f(*args):

(2)**kwargs,将参数转换为字典

def f(**kwargs):

def fun(name, *args, **kwargs)

func("Steve", "tt", "Lebron", addr="Beijing", age="24")


6. 变量,可以通过global指定某变量为全局变量

1)全局变量,定义在函数外部的一级代码。全局变量全局能用。默认全局变量全用大写

在函数里面修改全局变量:

name = 'a'
def change_name():
    global name
    name = b
    print(name)
print(name)
在函数里面无法修改的数据类型(不加global的话):str,int

2)局部变量,定义在函数里的变量。只在局部生效。默认局部变量全用小写。在函数内部,可以应用全局变量。如果全局和局部都有一个变量为data,函数查找变量的顺序为从内而外。



7. lambda表达式

lam = lambda a1, a2: a1 + a2



8. Python内置函数

1)abs,绝对值

n = abs(-12300)

2)all,循环参数,如果每个元素都为真,那么all的返回值为真,有一个为假则为假

r = all([True,True,False])

False

3)bool,0、None、空值都为假,其他为真,把一个对象转换成布尔值

4)any,只有一个为真,则为真

5)ascii,对象的类中找__repr__,获取其返回值

ascii(对象)

6)bin,二进制

7)oct,八进制

8)int,十进制

9)hex,十六进制

10)二进制转换为十进制

num = int('0b11', base = 2)

11)八进制转换为十进制

num = int('0o11', base = 8)

12)十六进制转换为十进制

num = int('0xe', base = 16)

13)bytes,字节

14)bytearray,字节列表

15)字符串转换为字节

bytes("xxx", encoding="utf-8")

16)callable,查看对象是否可以执行

def func1():

return 

r = callable(func1)

print r

17)compile,编译

code = '''def hellocute() return 123 '''

func  = compile(code, "<string>", "exec")

18)eval,转化为数值,有返回值,只能处理单行代码

ret = eval("1 + 3")

print ret

19)exec,执行字符串形式的python代码


exec("for i in range(10): print(i)")

20)filter,循环可以迭代的对象,获取每一个参数,函数(参数)

filter(函数,可以迭代的对象)

def func1(x):

if x > 10:

return True

else:

return False

ret = filter(func1, [8, 12, 7, 66, 45, 6, 92])

for i in ret:

print i

21)map,

map(函数,可以迭代的对象)

def func(x):

return x + 1

list1 = [1,2,3,4,5]

res = map(func, list1)

22)frozenset,不可变得集合

23)globals,获取当前代码中所有全局变量

23)locals,获取所有局部变量

24)hash,生成哈希值,一般用来作字典key的优化

25)id,查看对象内存地址

26)input,输入

27)isinstance,判断是否是某个类的对象

li = [11,2]

r = isinstance(li, list)

28)max,获取列表、集合等中的最大值

29)min,获取列表、集合等中的最小值

30)pow,求指数

i = pow(2, 10)

31)round,四舍五入

n = round(3.3)

31)open,文件操作

open(文件名,模式,编码)

打开文件的模式有:

r:只读模式【默认】

w:只写模式【不可读;不存在则创建;存在则清空内容】

x:只写模式【不可读;不存在则创建,存在则报错】

a:追加模式【不可读;不存在则创建;存在则只追加内容】

“+”表示可以同时读写某个文件

r+:读写【可读,可写】

w+:写读【可读,可写】


file = open('hadoop.log')

data = file.read()

file.close()

print data


字节文件的读写,python3中的方法,以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型

rb或r+b:只读,python内部将二进制编码转换成了字符串

file = open('hadoop.log', 'rb')

data = file.read()

file.close()

print(data)

wb或w+b:只写

file = open('hadoop.log', 'rb')

file.write(bytes("Hello World"), encoding='utf-8')

xb或x+b:

ab或a+b:


指针:

file = oepn("hadoop.log", "r+")

print(file.tell()) # file.tell() 当前指针的位置,刚打开文件指针为起始位置0,

data = file.read()

file.write("I love Python")

file.seek(0) # file.seek() 指定指针的位置

data = file.read(3) # file.read(3)指定指针的读取位置


# w,末尾追加,指针移动到最后

# w+,先清空,再写的时候,就可以读了,先清空,之后写的才能读写,指针到最后

file = open("hadoop.log", "w+", encoding="utf-8")

file.write("Steve")

file.seek(0)

data = file.read()

file.close()

print(data)


# x+如果文件存在,则报错

#a+追加内容,文件打开的同时,指针已经到最后了;写时,追加,指针也会放到最后

file = open("hadoop.log", "a+", encoding="utf-8")

data = file.read()

file.seek(0)

file.close()


file.tell() # 获取指针的位置

file.seek(num) # 调整指针的位置


32)sum,求和

33)type,查看对象类型

34)zip,将两个组合起来

li1 = [1,2,3,4]

li2 = ['a','b','c','d']

r = zip(li1, li2)

for i in r:

print i

35)sort,排序,元素必须是同一种类型

36)print

print(s, end='|', sequence='->')

37)locals,局部变量

38)



内置函数实例:生成一个随机数,65-90,数字转化正字母,chr(数字)

import random

i = random.randrange(65,91)

c = chr(i)

print c



内置函数实例:随机生成字符串

import random

temp = ""

for i in range(0,6):

num = random.randrange(4)

if num == 3 or num == 1:

rand1 = random.randrange(0,10)

temp += str(rand1)

else:

rand2 = random.randrange(65,91)

c = chr(rand2)

temp += c

print temp



9. 文件处理

f = open('data.txt', 'r', encoding='utf-8')

data = f.read()

f.close()

1)对文件的处理模式

'r',只读,字符。读完一遍内容后,光标会移到最后

'rb',只读,二进制

'w', 只写,字符

'wb',只写,二进制

'a', 追加

'r+', 读写混合

'w+', 写读混合,先创建文件,原来的文件内容先被重写


2)如果不知道文件的编码方式,chardet可以智能检测:

import chardet
result = chardet.detect(open('log', 'rb').read())
print(result)


3)循环文件

f = open('data.txt', 'r')
lines = f.read()
for line in lines:
    print(line)

4)对文件内容操作的api

(1)close,关闭文件

(2)fileno,文件描述符

(3)flush,刷新文件内部的缓冲区,把文件从内存强指刷新至硬盘

(4)read,读取指定字节数据

(5)readable,是否可读

(6)readline,仅读取一行数据

(7)seek,指定文件中指针位置

(8)seekable,指针是否可操作

(9)tell,获取指针位置

(10)truncate,截断数据,仅保留指定之前的数据

(11)write,写内容


10. 上下文管理,自动关闭文件,且可以同时打开两个文件

with open("hadoop1.log", 'r') as file1, open("hadoop2.log", "r") as file2:

pass

with open("hadoop1.log", "r") as file1, open("new_hadoop.log", "w") as file2:

pass


11. 递归

递归函数:

def factorial(n):
    if n == 1:
        return 1
    return n * factorial(n - 1)
print(factorial(10))

尾递归优化:

def cal(n):
    print(n)
    return cal(n + 1)
cal(1)



12. 命名空间,名称空间

名称空间正是存放名字x与1绑定关系的地方

1)名称空间共3种:

(1)locals:是函数内的名称空间,包括局部变量和形参

(2)globals:全局变量,函数定义所在模块的名字空间

(3)builtins:内置模块的名字空间


不同变量的作用域不同就是由这个变量所在的命名空间决定的

2)作用域即范围

(1)全局范围:全局存活,全局有效

(2)局部范围:临时存活,局部有效


3)作用域的查找范围

locals-》enclosing function-》globals-》__builtins__

locals是函数内的名字空间,包括局部变量和形参

enclosing外部嵌套函数的名字空间

globals全局变量,函数定义所在模块的名字空间

builtins内置模块的名字空间


13. 闭包

代码示例:

def func():
    n = 10
    def func2():
        print("funky:", n)
    return func2

f = func()
print(f)
f()


猜你喜欢

转载自blog.csdn.net/wayne12081213/article/details/78744491