Python基础知识以及模块学习

1、深拷贝与浅拷贝

1.1先看一个例子

#删除list里的奇数
l = [1,1,1,2,3,4,5]
for i in l:
    if i%2 !=0:
        l.remove(i)
print(l)  #[1, 2, 4]

由上面例子看出,得到结果不对,由此得出:循环删除list的时候,会导致下标错误,结果是不对的;所以,循环list的时候,不要删除元素。所以,我们改进一种方式,虽然有些繁琐:

l = [1,1,1,2,3,4,5]
l2 = [1,1,1,2,3,4,5] #循环list2,删除list1.
print(id(l))
print(id(l2)) #这时候,二者的内存地址不同。
for i in l2:
    print('本次循环的i为:',i)
    if i%2 !=0:
        l.remove(i)
print(l)

有此,我们引出深拷贝与浅拷贝:

浅拷贝:两变量二者指向同一块内存地址。浅拷贝的方式:[1、如:l2=l 2、l2=l.copy()]

深拷贝:如l2 = copy.deepcopy(l),前提是需要引入copy模块,二者内存地址不同,所以上面例子可以用深拷贝与浅拷贝改为:

#浅拷贝,依然得不到正确答案,如下:
l = [1,1,1,2,3,4,5]
l2 = l #这是浅拷贝,二者指向同一块内存地址。
#等同于 l2=l.copy() #这个也是浅拷贝
print(id(l))
print(id(l2))
for i in l2:
    print('本次循环的i为:',i)
    if i%2 !=0:
        l.remove(i)
print(l)


#深拷贝,可以得到正确答案如下:
import copy
l = [1,1,1,2,3,4,5]
l2 = copy.deepcopy(l)
print(id(l))
print(id(l2))#深拷贝,二者内存地址不同。
for i in l2:
    print('本次循环的i为:',i)
    if i%2 !=0:
        l.remove(i)
print(l)

2、代码法则:非空即真,非零即真。这里的空:包括空字符串、空元祖、空list、空dictionary等等,代码优化例子如下:

name = input('请输入名字:').strip()
if name != '':
    print('输入正确!')
else:
    print('不能为空')

#=========与下面等同==============
name = input('请输入名字:').strip()
if name:
    print('输入正确!')
else:
    print('不能为空')

3、函数的简单介绍,例子如下:

name = 'xiaoli'  #全局变量
def my(name,sex): #形参,位置参数,必填的。
    #函数内部的叫函数体
    name = 'python' #局部变量
    return name  #函数的返回

#==============================
#默认值参数,不必传。
def db_connect(ip,port=3306):
    print(ip,port)


#return的作用:
#1、结束函数,只要函数里遇到return,函数立即结束运行,无论return后面有多少代码,都不会执行。
#2、返回函数处理的结果。

3.1函数练习:校验一个值是否是小数:

def check_float(s:str):
    '''
    函数的作用就是判断传入的字符串是否是合法的小数
    :param s: 传入一个字符串。
    :return: True or False
    '''
    s = str(s)
    if s.count('.')== 1:
        left, right = s.split('.')
        if left.isdigit() and right.isdigit():
            return True
        elif right.isdigit() and left.startswith('-')\
            and left[1:].isdigit():
            return True
    return False

3.2可变参数与关键字参数,举例说明:

def send_sms(*args): #一般变量名叫*args,不过可以随意叫。
    #可变参数,参数组
    #1、不是必传的
    #2、它把传入的元素全部都放到一个元祖里
    #3、不限制参数个数
    #4、它用在参数比较多的情况下【给多个人发邮件,发短信。】
    print(args)

send_sms() #不传参数
send_sms(1234567890) #传一个
send_sms(1234567890,123456789,12345678,1234567) #传N个


#==============================================
def send_sms2(**kwargs): #一般变量名叫**kwargs,不过可以随意叫。
    #关键字参数,参数组
    #1、不是必传的
    #2、它把传入的元素全部都放到一个字典里,必须用key-value形式来传。
    #3、不限制参数个数
    print(kwargs)
#
send_sms2() #不传参数
send_sms2(a='1234567890') #传一个
send_sms2(a='1234567890',b='123456789') #传二个
send_sms2(a='1234567890',b='123456789',c='12345678',d='1234567') #传N个

目前为止,我们学到了4种参数类型:1、位置参数 2、默认值参数 3、可变参数,4关键字参数,实际运用时候,并无先后顺序。

4、集合:是一种继int/float/dic/tuple/str/list/bool之后的一种新的数据类型,set,它的特点:

             1、天生去重,2、集合是无序的,不能排序,不能根据下标取值

举例说明:

l = set()  #定义一个空的集合
print(type(l))
print(l)

#=======================================
#集合去重的用法如下:
l = [123456,123456,12346,1345,123456,123456]
res = set(l)
print(res)

4.1、集合的几个使用

集合可以取交集、并集、差集、对称差集、方法以及符号举例如下:

xn = ['xiaowang','xiaoli','xiaoluo']
zdh = ['xiaowang','xiaoli','xiaoliu','xiaojun','hailong']
xn = set(xn)
zdh = set(zdh)
#取交集
res = xn.intersection(zdh)
res = xn & zdh#上同
#取并集,把两个集合合并到一起,然后去重。
res = xn.union(zdh)
res = xn | zdh  #上同
#取差集
res = xn.difference(zdh)  #在xn里有,在zdh里没有的
res = xn - zdh  ##上同
res1 = zdh.difference(xn)  #在xn里有,在zdh里没有的
res1 = zdh - xn #上同
#取对称差集,取二者里面对方都没有的元素。
res = xn.symmetric_difference(zdh)
res = xn ^ zdh  #上同。
print(res)

集合的其他方法使用如下:

import string
l1 = set(string.ascii_lowercase)
l2 = {'a','b','c'}
l3 = {1,2,3}
print(l2.issubset(l1)) #是否是子集
print(l1.issuperset(l2)) #是否是父集
print(l3.isdisjoint(l2)) #是否有交集,有交集返回False,无交集返回True.
l2.add('d') #给集合添加一个元素
l2.remove('a')  #删除指定元素
l2.pop()  #随机删除集合里元素
#集合可以循环取值。
for i in l2:
    print(i)

5、模块的介绍:首先说下模块的分类:总共分为3大块:

1、标准模块==不需要单独安装,Python自带的模块
2、第三方模块
3、自己写的Python文件。

5.1先说下Python自带模块里的random模块,举例常用方法来说明:

import random
print(random.randint(M,N)) #随机产生M与N之间的一个数,包含两边

stus = ['xiaoli','xiaowang','yangyang','cc','nn']
#只要可以循环的,都可以帮忙随机取,包括字符串/list/dic/set/tuple
print(random.choice(stus))  #在list里随机选择一个元素
print(random.sample(stus,2))  #随机选择N个元素
l = list(range(1,101))
random.shuffle(l) #洗牌,这个函数无返回值。这个值能传入list元素。
print('洗牌之后:',l)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值