python学习笔记(三):切片、复制、非空即真非0即真、列表生成式、三元表达式、集合、json操作、函数、内置函数

1.切片(对list取值的一种方式)

#切片
li = [1,2,3,4,5,6,7,8]
print(li[0:4])#切片顾头不顾尾,左闭右开,[0:4]取的是list[0]~list[3]
print(li[:3])#冒号左面不写默认是0
print(li[:])#两面都不写,取所有
print(li[::2])#隔一个取一个
print(li[0:3:2])#重list[0]~list[2]隔一个取一个
print(li[::-2])#从最后一个开始往前隔一个取一个
print(li[-1:-4:-2])#从最后一个开始往前隔一个取一个取到倒数第四个

测试结果:
[1, 2, 3, 4]
[1, 2, 3]
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 3, 5, 7]
[1, 3]
[8, 6, 4, 2]
[8, 6]

2.复制

#复制分为浅复制和深复制两种,
# 浅复制,被复制者a和复制者b之间的关系:二者指向同一内存地址,修改a就是修改b,修改b也等同于修改a
# 深复制,被复制者a和复制者b之间的关系:二者指向不同的内存地址,二者之间的修改不会互相影响
#1.浅复制举例
#这样复制的话就是浅复制,li和li2指向的是同一个地址,所以li修改也就是li2修改,li2修改也是li修改
li = [1,2,3,4]
li2 = li
print('li的id地址为:%s' % id(li))
print('li2的地址为:%s' % id(li2))

测试结果:
li的id地址为:4434112328
li2的地址为:4434112328
#2.深复制举例
#深复制方法1
li = [1,2,3,4]
li2 = li[:]
print('li的id地址为:%s\nli的内容为:%s' % (id(li),li[:]))
print('li2的地址为:%s\nli2的内容为:%s' % (id(li2),li2[:]))

测试结果:
li的id地址为:4351401800
li的内容为:[1, 2, 3, 4]
li2的地址为:4351401864
li2的内容为:[1, 2, 3, 4]
#深复制方法2
import copy

li = [1,2,3,4]
li2 = copy.deepcopy(li)

print('li的id地址为:%s\nli的内容为:%s' % (id(li),li[:]))
print('li2的地址为:%s\nli2的内容为:%s' % (id(li2),li2[:]))

测试结果:
li的id地址为:4509234312
li的内容为:[1, 2, 3, 4]
li2的地址为:4508405384
li2的内容为:[1, 2, 3, 4]
#遍历list的话不要随便删除list元素,否则会导致下标错乱

li = [1,1,2,3,4,5,6,7,8,8,8,9]
#获取list中所有偶数
#正确写法:
li2 = li[:]
for l in li2:
    if l % 2 != 0:
        li.remove(l)
print(li)

测试结果:
[2, 4, 6, 8, 8, 8]

# 错误写法
for i in li:
    if i%2!=0:
        li.remove(i)
print(li)

测试结果:
[1, 2, 4, 6, 8, 8, 8]

 3.非空即真、非0即真

# 空的情况
# s =''
# l = []
# c = {}
# y = ()
# None

if None:#是None的话则if不成立走else
    print('')
else:
    print('')

#0的情况
if 0 :#是0的话则if不成立走else
    print('')
else:
    print('')

测试结果:
假
假

 4.列表生成式

list = []
for i in range(20):
    n = str(i).zfill(2)#补零函数,小于3位补0
    list.append(n)

print(list)

测试结果:
['00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19']

#以上代码用一行完成如下:
list2 = [str(i).zfill(2) for i in range(20)]
print(list2)

测试结果:
['00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19']
#带判断的
list3 = []
for i in range(20):
    if i < 10:
        n = str(i).zfill(2)#补零函数,小于3位补0
        list3.append(n)

print(list3)

测试结果:
['00', '01', '02', '03', '04', '05', '06', '07', '08', '09']

#以上代码用一行完成如下:
list4 = [str(i).zfill(2) for i in range(20) if i < 10]
print(list4)

测试结果:
['00', '01', '02', '03', '04', '05', '06', '07', '08', '09']

5.三元表达式

#三元表达式
id_card = '321321111111111161'
sex = "" if int(id_card[-2]) % 2 == 0 else ''
print(sex)

测试结果:
女

id_card = '321321111111111111'
sex = "" if int(id_card[-2]) % 2 == 0 else ''
print(sex)

测试结果:
男

6.集合(集合是无序的,而且天生可以去重)

#空集合
c = {}
print(c)

c2 = set()
print(c)

测试结果:
{}
{}

# 添加
# 方法1:
c2.add(1)
c2.add(2)
c2.add(3)
print(c2)

测试结果:
{1, 2, 3}

# 方法2:
l = [1,2,2,3,4,9,6]
c = set(l)
print(c)#集合是无序的,没有下标,没法取值,若要取值可以先变成list然后再取

测试结果:
{1, 2, 3, 4, 6, 9}

#删除
c2.remove(1)
print(c2)

测试结果:
{2, 3}

 

#交集、并集、差集、对称差集

list1_name = ['wangxiaoyu','lixiaokai','lijunhao','lixinran','yaoyao']

list2_name = ['wangxiaoyu','lixiaokai','lijunhao','lixinran','liheping','lisan']

set_list1_name = set(list1_name)
set_list2_name = set(list2_name)
# 1.交集
print("交集_函数方式:",set_list1_name.intersection(set_list2_name))
print("交集_字符方式:",set_list1_name & set_list2_name)
# 2.并集
print("并集_函数方式:",set_list1_name.union(set_list2_name))
print("并集_字符方式:",set_list1_name | set_list2_name)
# 3.差集
print("差集_函数方式:",set_list1_name.difference(set_list2_name))
print("差集_字符方式:",set_list1_name - set_list2_name)
# 4.对称差集
print("对称差集_函数方式:",set_list1_name.symmetric_difference(set_list2_name))
print("对称差集_字符方式:",set_list1_name ^ set_list2_name)


测试结果:
交集_函数方式: {'lixiaokai', 'lijunhao', 'lixinran', 'wangxiaoyu'}
交集_字符方式: {'lixiaokai', 'lijunhao', 'lixinran', 'wangxiaoyu'}
并集_函数方式: {'lijunhao', 'wangxiaoyu', 'lisan', 'yaoyao', 'lixinran', 'lixiaokai', 'liheping'}
并集_字符方式: {'lijunhao', 'wangxiaoyu', 'lisan', 'yaoyao', 'lixinran', 'lixiaokai', 'liheping'}
差集_函数方式: {'yaoyao'}
差集_字符方式: {'yaoyao'}
对称差集_函数方式: {'yaoyao', 'lisan', 'liheping'}
对称差集_字符方式: {'yaoyao', 'lisan', 'liheping'}

 7.json操作

#json串就是一个字符串
import json

str = {
        "error_code": 0,
        "stu_info": [
                {
                        "id": 314,
                        "name": "矿泉水",
                        "sex": "",
                        "age": 18,
                        "addr": "北京市昌平区",
                        "grade": "摩羯座",
                        "phone": "18317155666",
                        "gold": 100
                },
                {
                        "id": 315,
                        "name": "矿泉水",
                        "sex": "",
                        "age": 27,
                        "addr": "上海",
                        "grade": "摩羯座",
                        "phone": "18317155668",
                        "gold": 100
                }
        ]
}
#字典转换成字符串
#文件写成.json格式的话,文件里头的json串就会带颜色,很好看,不过这里的文件后缀无要求
with open('users.json','w',encoding='utf-8') as fw:

        print('json.dumps转换前:',type(str))
        #dumps把字典转换成string字符串,ensure_ascii=False 中文正常显示、indent=4 4个缩进
        f = json.dumps(str,ensure_ascii=False,indent=4)#因为字典不可以直接写到文件中,所以写之前要先把字典先转成字符串再写
        print('json.dumps转换后:',type(f))
        fw.write(f)

测试结果:
json.dumps转换前: <class 'dict'>
json.dumps转换后: <class 'str'>
#字典格式的字符串转换成字典
with open('users.json','r',encoding='utf-8') as fr:
        s = fr.read()
        print('json.loads转换前:',type(s))
        ss = json.loads(s)
        print('json.loads转换后:',type(ss))

测试结果:
json.loads转换前: <class 'str'>
json.loads转换后: <class 'dict'>
#直接操作整个文件
#读文件,把字典格式的文件读出来并转换成字典(从文件中读出来的是字符串,所以要通过json转换下)
with open(r'users.json',encoding='utf-8') as fr:
        s = json.load(fr)#直接把文件转换成字典读出来
        print('读到的内容类型为:',type(s))
        print('读到的内容为:', s)

测试结果:
读到的内容类型为: <class 'dict'>
读到的内容为: {'error_code': 0, 'stu_info': [{'id': 314, 'name': '矿泉水', 'sex': '', 'age': 18, 'addr': '北京市昌平区', 'grade': '摩羯座', 'phone': '18317155666', 'gold': 100}, {'id': 315, 'name': '矿泉水', 'sex': '', 'age': 27, 'addr': '上海', 'grade': '摩羯座', 'phone': '18317155668', 'gold': 100}]}
#直接操作整个文件
#写文件(直接把字典写到文件中)
with open(r'users.json','w',encoding='utf-8') as fw:#文件写成.json格式的话,文件里头的json串就会带颜色,很好看,不过这里的文件后缀无要求
        json.dump(str,fw,ensure_ascii=False,indent=4)#dumps把字典转换成json格式的string字符串,ensure_ascii=False 中文正常显示、indent=4 4个缩进

测试结果:

 8.函数

#def 函数名(参数):

#
#无参函数,无返回值
def sayHello():
    print('hello !')

# 调用函数
sayHello()

测试结果:
hello !

#有参函数,无返回值
def sayHello(name):#name:形参
    print('hello %s !' % name)
# 调用函数
sayHello('wangxiaoyu')#wangxiaoyu:实参

测试结果:hello wangxiaoyu !


# 有返回值
def sayHello(name,age=18):
    return 'hello,' + name + ',age:' + str(age)
print(sayHello('lixiaokai'))

测试结果:
hello,lixiaokai,age:18
    
# 写一个判断所给的数字是否是小数的函数

#分析:

# 小数分为两种请求,1.正小数 2.负小数


# 1.正小数如:1. 、1.56
#1、只有一个小数点
#2、小数点左右是整数


#2.负小数如:-1.6
#1、只有一个小数点
#2、小数点左边以负号开始,且只有一个符号,且时整数、小数点右边是整数

def is_float(floalt_num):

    sfn = str(floalt_num)#将传过来的数字转换成字符串,以便用split分割等函数
    left_n,right_n = sfn.split('.')
    if sfn.count('.') == 1:
        if left_n.isdigit() and right_n.isdigit():
            print('正小数!')
        elif left_n.startswith("-") and left_n[1:].isdigit() and right_n.isdigit():
            print('负小数!')
        else:
            print('不是合法的小数!',floalt_num)
    else:
        print('您输入的小数不合法!',floalt_num)

is_float(.2)
is_float(1.2)
is_float(-1.0)
is_float(.2)
is_float(1-2.2)

测试结果:
正小数!
正小数!
负小数!
正小数!
负小数!

9.内置函数

import random

print(random.randint(0,10))#在0和10之前随机取一个数

测试结果:
2
print(random.sample('1d2345678',3))#在字符串之间随机取几个数

测试结果:
['3', '6', '4']
print(random.uniform(0,99))#随机取小数

测试结果:
53.438953003608724
l = [1,2,4,5,6,7]
random.shuffle(l)#把list中的数随机打乱
print(l)

测试结果:
[1, 6, 2, 4, 5, 7]
import string

print(string.digits)#所有整数

测试结果:
0123456789
print(string.ascii_letters)#所有大写和小写字母

测试结果:
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.ascii_lowercase)#所有小写字母

测试结果:
abcdefghijklmnopqrstuvwxyz
print(string.ascii_uppercase)#所有大写字母

测试结果:
ABCDEFGHIJKLMNOPQRSTUVWXYZ
print(string.punctuation)#所有特殊符号

测试结果:
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
print(random.choice(string.digits))#所有整数随机取一个

测试结果:
8
#案例
#产生一批用户名,长度在6-12之间,产生这一批用户名不能重复,用户名需要以字母开头,必须包含字母和数字

#分析
#1.函数中传递一个用户名的条数的参数,数字是几循环几次
#2.随机获取一个6-12之间的长度
#3.因为用户名不能重复,所以用集合存放用户名
#4.产生6-12个包含数字和字母,以字母开头(与所有的大小写字母存在交集,与所有的数字存在交集)


import random
import string

def random_name(n):
    names = set()#集合,自动去重
    while True:
        rn = random.randint(6,12)#随机产生一个数字,要求数字值在6到12之间
        name = random.sample(string.ascii_letters + string.digits,rn)#在所有大小写字母及数字之间随机产生rn个字符
        if len(names) == n:#如果长度等于用户要求的条数,结束
            break
        #1.产生的用户名第一个字符是字母2.用户名与26个字母大小写存在交集3.用户名与所有数字存在交集
        if name[0] in string.ascii_letters and set(name) & set(string.ascii_letters) and set(name) & set(string.digits):
            names.add("".join(name) + '@163.com')#join将list转换成字符串
    return names


print(random_name(5))#产生5条有户名邮箱

测试结果:
{'[email protected]', '[email protected]', '[email protected]', '[email protected]', '[email protected]'}

 

你可能感兴趣的:(python学习笔记(三):切片、复制、非空即真非0即真、列表生成式、三元表达式、集合、json操作、函数、内置函数)