我的Python学习之路02-附练习题

本文深入讲解Python的基础语法,包括表达式与声明、关键字与标识符、标准操作符、名字空间概念、内置函数与数据类型。涵盖了数值、字符串、列表、元组、字典等基本数据结构的操作与访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python基础语法格式,表达式与声明

Python基础语法格式


# 缩进 PEP8   https://www.python.org/dev/peps/pep-0008/
# PEP是Python Enhancement Proposals的缩写。
# 一个PEP是一份为Python社区提供各种增强功能的技术规格,也是提交新特性,以便让社区指出问题,精确化技术文档的提案。

#分隔代码块:

title='weijichen.com';score=61

if title=='weijichen.com':
    print('welcome to weijichen.com')
    if score<60:
        pass
        
#模块
import random
# dir(random)

#帮助的使用
#dir,help,?,??,shift+tab,tab,相关Python的小抄
s1='china'
print(dir(s1))
print(s1.__doc__)
s1.rfind?

表达式与声明

#### statement声明
a='weijichen.com'#statement通常为赋值语句
b=100
c=a

#### expression表达式(通常有返回结果 )

#值、变量和运算符共同组成的整体我们将其称为表达式。通常有值表达式、变量表达式、计算表达式、字符串表达式,
b,b+100,a+' is amazing',__builtins__
exec执行声明语句,eval执行表达式
exec('aaaa=7')
aaaa

输出结果为7

exec('aaa=7')#从字符串里执行一个声明语句
eval('aaa')#从字符串里执行一个表达式

输出结果为7

eval()函数和exec() 函数的区别:
eval() 函数只能计算单个表达式的值,而exec() 函数可以动态运行代码段。
eval() 函数可以有返回值,而exec()函数返回值永远为None。

参考文章:https://www.cnblogs.com/yangmingxianshen/p/7810496.html

关键字、标识符,标准操作符,名字,赋值与名字空间

Python中保留的关键字

import keyword
print(keyword.kwlist)

输出的结果为:

[‘False’, ‘None’, ‘True’, ‘and’, ‘as’, ‘assert’, ‘async’, ‘await’,
‘break’, ‘class’, ‘continue’, ‘def’, ‘del’, ‘elif’, ‘else’, ‘except’,
‘finally’, ‘for’, ‘from’, ‘global’, ‘if’, ‘import’, ‘in’, ‘is’,
‘lambda’, ‘nonlocal’, ‘not’, ‘or’, ‘pass’, ‘raise’, ‘return’, ‘try’,
‘while’, ‘with’, ‘yield’]

合法标识符

  • 数字,下划线,字母构成
  • 避开关键字
  • 不能用数字开头
好的命名习惯让开发更有效率
  • 变量,函数或方法:salary,houseworker,booksname
  • 常量:INTEREST_RATES
  • 类:BankAccount,Employee,Company,OrderedDict #骆峰命名法
名字与对象之间的建立引用与解除引用

我们可以使用=建立名字与对象之间的关联,用del 名字来解除这种关联

标准操作符

#算术运算符
a=100;b=3
a+b;a-b;a*b;a/b
a//b #取商
a%b #取余
a**2
a**0.5

#比较运算符  
if a==b:
    print ('a equal b')

if a!=b:
    print ('a not equal b')
    
#逻辑运算符><>=,
if a>=50:
    print('a is grater than 50')
    
#成员运算符in,not in
websiteUrl='weijichen.com'
if '.net' not in websiteUrl:
    print ('.net not in it')
    

#多重赋值
#a=100;b=100
a=b=100

#多元赋值
#a=100;b=200
a,b,c=100,200,200

#交换赋值
a,b=b,a
print(a,b)

#unpack解包
l1=[1,2,3,4,5,'6']
a,b,c,d,e,f=l1
print(a,b,c,d,e)

#*号收集
a,*b,c=l1
print(a,b,c)

#*号展开,针对序列
l1=[1,2,3,4]
s1='weijichen.com'
[*l1,*s1]

#*号展开,针对字典
d1={'name':'machine learning 5th','add':'BJ,SH,*'}
[*d1],{**d1,'date':'2018-7-30'}

#,号放在最后的解包
l1=[[3,4,5]]
a=l1
b,=l1
print(a,b)
扩展阅读:运算符的优先级
第一名 - 函数调用、寻址、下标
第二名 - 幂运算 **
第三名 - 翻转运算符 ~
第四名 - 正负号
第五名 - *、/、%
第六名 - +、-

名字,赋值与名字空间

名字空间与局部作用域L,全局作用域G
在《程序设计语言——实践之路》里的术语,将名字和与其绑定的对象之间的关系,称为约束。赋值语句就是约束建立的地方。
约束既然是(name,obj)这样的关联关系,约束关系的容身之地便是就是名字空间(字典对象)

#当不在任何一个函数体内的时候的时候,locals()和globals()是同一个对象
locals() is globals()

# #而每当进入一个函数时,也会新产生一个locals(),这个locals()和globals()就不在相同了

# #普通命名法
teacher_name='david'

#直接命名法
globals()['teacher']='david'
teacher

%whos

Python内置电池简介

BIFs 自带电池(__builtins__模块)与模块作用域B

内置模块__builtins__由解释器负责导入,受到解释器特殊对待

dir(__builtins__)

常用功能说明

help(obj) 在线帮助, obj可是任何类型    

eval(str) 表示合法的python表达式,返回这个表达式 
exec(str) 执行合法的python声明,返回字节码

#名字空间相关
dir(obj) 查看obj的name space中可见的name
vars(obj) 返回一个object的name space。用dictionary表示    
locals() 返回一个局部name space,用dictionary表示    
globals() 返回一个全局name space,用dictionary表示

#类型
type(obj) 查看一个obj的类型    
isinstance(obj,cls) 查看obj是不是cls的instance    
issubclass(subcls,supcls) 查看subcls是不是supcls的子类  

#类型转换
chr(i) 把一个ASCII数值,变成字符    
ord(i) 把一个字符或者unicode字符,变成ASCII数值    
oct(x) 把整数x变成八进制表示的字符串    
hex(x) 把整数x变成十六进制表示的字符串    
str(obj) 得到obj的字符串描述    
list(seq) 把一个sequence转换成一个list    
tuple(seq) 把一个sequence转换成一个tuple    
dict(),dict(list) 转换成一个dictionary    
int(x) 转换成一个integer    
long(x) 转换成一个long interger    
float(x) 转换成一个浮点数    
complex(x) 转换成复数

除了全局作用域Global外,还有一个作用域叫Builtin,指的就是这个模块。。

#把名为name,约束对象为'David'的kv,存储在了__builtins__这个模块中。而不是globals()中
__builtins__.name1='David'

%whos
name1

Python中的对象:不可变对象(数字与字符串),可变对象(List,Tuple,Dict等)相应操作与访问

Python中的对象:

%config ZMQInteractiveShell.ast_node_interactivity='all'
type('weijichen.com')
type(len)
True & False 与None对象
#If后面的判断,除了bool型的true或false,还可以是对对象的判断。
#如果对象的类型是NoneObject,则和False同理,否则为True.

Test=None
if Test:
    print('None Object equals to True')
Test='t'
if Test:
    print('Other Object equals to True')

输出结果为:

Other Object equals to True

使用type查看
type('str')

type(len)

def a():
    pass

type(a)

不可变对象(数字与字符串)相应操作

#数值整形
a=100;b=200

#进制转换
a=0b0101001#bin()
b=0o4#oct()
c=0x28#hex()

#浮点型
a=3.1415

#科学计算法
c=5e13
print(c)

#数字的正负无穷
#float('inf')正无穷
#float('-inf')负无穷
if 99999999999999999<float('inf'):
    print('you win!')

#复数
a=4.3+22j
type(a)


#数值类型转换
a=4.48
b=8
int(a)

round(a,1)
延伸阅读:数值塔(numerical tower)

Python 的数值层次结构的灵感来自于 Scheme 语言的数值塔。
numbers 模块内并包括 Number, Complex,Real,Rational,Integral

##字符串型
#初始化及转义
str1='''AI'''
str2='weijichen.com'


#访问,索引及切片访问
str2[-1]

#str2[start:end:stried]
#切片访问的特点:左闭右开[)
str2[0:4]

#格式化访问1
companyName='weijichen'
str3='http://{}.cn'
print(str3.format(companyName))

#格式化访问2
print("Company name is %s" %companyName)

#格式化访问3
_='Python 3.6'#fstring only can be used under version 3.6
str4=f"fstring is new feature of {_}"
str4

        
        
#查找与替换
str3.find('o')
str3.replace('.com','.net')

#统计 count() 方法用于统计字符串里某个字符出现的次数
str3.count('com')

延伸阅读:Python3下的bytes与str

使用bytes类型,实质上是告诉Python,不需要它帮你自动地完成编码和解码的工作,而是用户自己手动进行,并指定编码格式。Python已经严格区分了bytes和str两种数据类型,你不能在需要bytes类型参数的时候使用str参数,反之亦然。

编码过程:str->encode->bytes->decode->str

ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:
len()函数计算的是str的字符数,如果换成bytes,len()函数就计算字节数

b='中'
b.encode(),ord(b),hex(ord(b)),chr(20013)

输出结果为:

(b’\xe4\xb8\xad’, 20013, ‘0x4e2d’, ‘中’)

#1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节。
len(b),len(b.encode())
延伸阅读:Python3下的编码
a='水a'
#对字符  水a  进行不同类型的编码为bytes对象后打印 
a_gb2312=bytes(a,encoding='gb2312')
a_gbk=bytes(a,encoding='gb2312')
a_big5=bytes(a,encoding='big5')
a_default_unicode=a.encode()#Python3是默认的unicode,就是utf-8
print('gb2312:',a_gb2312,'gbk:',a_gbk,'big5:',a_big5,'utf-8/unicode:',a_default_unicode)

#对bytes对象,指定格式进行解码后
print(a_gb2312.decode(encoding='gb2312'),a_gbk.decode(encoding='gbk'),a_big5.decode(encoding='big5'))

#gbk编码,使用big5解码,于是就乱码了
a_gbk.decode('big5')#'阨a'

#这个检测编码格式不太靠谱,仅供参考,具体还要依靠来源文档编码
import chardet
print(chardet.detect(a_gbk))
延伸阅读:Python 2.x Unicode老大难问题以及Python3中的utf-8编码[Python 2.x存储字符的中间过程]

https://blog.youkuaiyun.com/ggggiqnypgjg/article/details/72783356

Python2中的unicode是内存编码集,也就是说字符串在Python内部的表示是unicode编码(Python 2.X),在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。

u’string’ 表示 已经是 unicode 编码的 ‘string’ 字符串

而 unicode(‘string’) 是 即将要把 ‘string’ 转化为 unicode 编码(但在执行这条语句之前,还不一定是unicode编码)

字符前面加u就表明这是一个unicode对象,这个字会以unicode格式存在于内存中

而Python3中取消了unicode,默认均为utf-8

延伸阅读:小整数缓存区与字符驻留
# Python中,根据实例是否可修改,分为可变与不可变两种类型数据 
#小整数
#Python为小整数(-5至256)已创建地址并存入在小整数缓存区
#因而超过此范围则会放入整数链表,也就是相关整数是不同的对象
#虽然是整数对象,但地址也不相同。
a=77;b=77
a is b#True   #小整数缓存池,只有同一个位置。目的是把常用的东西放在缓存池,减小开销
a=998;b=998
a is b#False

#字符串驻留intern
str_a='weijichen'
str_b='weijichen'
str_a is str_b#True 正常字符串,地址相同


str_c='Python 3.5'
str_d='Python 3.5'
str_c is str_d#False 有些稍特殊的字符串,Python认为复用性不大,于是被分配到堆上,不会在内存池中检查。因此这是两个对象。

import sys
str_e=sys.intern('Python 3.5')#强制将字符串缓存进了内存池,因此相等。str_e,str_f均指向Arena相同位置
str_f=sys.intern('Python 3.5')
str_e is str_f #True

可变对象(List,Tuple,Dict等)相应操作与访问

#Array[]:相同类型元素的序列
from array import array
a1=array('h',[1,2,3])
memv=memoryview(a1)#内存视图
len(memv)
memv[0]=55
a1
dir(a1)#array相关操作

#复制操作:对bytearray对象片断是复制,而非直接引用。
str1=bytearray('中国','utf-8')
print('str1',str1[0:3])#序列访问
tempstr=str1[0:3]#片断赋值给新变量
tempstr[0:3]=b'\xff\xff\xff'
print('tempstr:',tempstr)
print('old str1',str1)#原str1没有变化,因此是发生了复制。。

#直接操作
#bytes,bytearray,array.arrray支持视图操作
v=memoryview(str1)#对str1进行内存视图
v[0:3]=b'\xff\xff\xff'#此时对视图对象操作,即是对原str1操作了
print(str1)

a1 = array('l')#创建数组
a1.append(9)# 添加元素
a1.append(9)
a1.append(8)


#列表[]:任意元素类型对象的序列
l1=[1,'china',['AI','weijichen.com']]
l1.append('hello world')


#元组()tuple,只读列表
t1=(1,2,3,4)
dir(t1)
#只读列表是真的只读吗?
t2=(1,2,3,[4,5,6])
# t2[0]=11#报错
t2[3].append(7)#正确
t2

#tuple的单元素写法
(3)(3,)哪个是tuple对象呢?
type((3)),type((3,))
#这里跟逗号又扯上关系,
#不仅如此,在交互式命令行中,当我们输入4,时返回的也是一个tuple对象


#集合{}set:无序的不重复元素,集合中的对象,通常叫key
s1={1,1,1,2,3,4,5,2,4,234}
l2=[1,1,1,2,3,4,5,2,4,234]
set(s1)

##frozenset
frozenset(range(7))
frozenset({x+1 for x in range(-1,7) if x%2==0})


#字典{}dict:KV对应型数据类型{
d1={'name':'david','gender':'male'}


#字典的视图
#Python3下字典视图,既同步读取字典,又却无法修改。
d1=dict(a=1,b=2)
ks=d1.keys()#返回的是主键视图,其类型为<class 'dict_keys'>
print('b' in ks)#直接从该视图中观察字典
for key in ks:
    print(key,d1[key])
    

d1['b']=3#更新原字典
d1['c']=99#对原字典插入新值
for key in ks:#此时并未再次运行d1.keys(),也能看到原字典的变化
print(key,d1[key])    


#标准库下的其它字典OrderedDict
from collections import OrderedDict

od1=OrderedDict()#按主键首次插入顺序进行排序

od1['a']=7
od1['z']=8
od1['b']=9
od1

延伸阅读 Python中的三种赋值方式 =,copy,deepcopy

import copy
a=[1,2,3,[4,5,6]]
b=a#赋值
c=copy.copy(a)#shallow copy
d=copy.deepcopy(a)#Deep copy
#列表推导式:从一个列表中生成一个新的列表,简化了循环的写法
l1= [x for x in range(30) if x%3==0]
l1

练习:

接收一个字符串,判断其做为Python标识符是否合法

a.isidentifier()

以单词为单位反转字符串

将’I am a student’按单词为单位进行进行反转字符串,得到’I ma a tneduts’

[item[::-1] for item in 'I am a student'.split(' ')]

词频统计wordcount

请计算['AI','weijichen.cn','Python','AI','Julyedu','Python']这个列表中每个单词出现的次数

for item in ll:
    ll.count(item)

输入一个字符串返回满足以下条件的字符串

  • 如果字符串长度小于3,打印出原字符串
  • 否则:
    • 如果字符串是以 ‘ing’ 结尾的,就在末尾添加 'ly’后打印
    • 添加 ‘ing’ 到字符串的末尾后打印

例如: 输入 a 返回 b 输入 ab 返回 ab 输入 bing 返回 bingly 输入 chang 返回 changing

ss=input()
if len(ss) < 3:
    print(ss)
elif ss.endswith("ing"):
    print("%sly"%ss)
else:
    print("%sing"%ss)

集合操作

  • 生成一个包含从0到100数字的列表,对其随机采样两次。分别输出两次采样的交集和并集
  • 参考使用random模块下sample方法
import random
arr=[]
for i in range(10):
    arr.append(random.randint(0,100))
arr
one=random.sample(arr,1)
sec=random.sample(arr,1)

set(one) & set(sec)
set(one) | set(sec)
### 解决PyCharm无法加载Conda虚拟环境的方法 #### 配置设置 为了使 PyCharm 能够成功识别并使用 Conda 创建的虚拟环境,需确保 Anaconda 的路径已正确添加至系统的环境变量中[^1]。这一步骤至关重要,因为只有当 Python 解释器及其关联工具被加入 PATH 后,IDE 才能顺利找到它们。 对于 Windows 用户而言,在安装 Anaconda 时,默认情况下会询问是否将它添加到系统路径里;如果当时选择了否,则现在应该手动完成此操作。具体做法是在“高级系统设置”的“环境变量”选项内编辑 `Path` 变量,追加 Anaconda 安装目录下的 Scripts 文件夹位置。 另外,建议每次新建项目前都通过命令行先激活目标 conda env: ```bash conda activate myenvname ``` 接着再启动 IDE 进入工作区,这样有助于减少兼容性方面的问题发生概率。 #### 常见错误及修复方法 ##### 错误一:未发现任何解释器 症状表现为打开 PyCharm 新建工程向导页面找不到由 Conda 构建出来的 interpreter 列表项。此时应前往 Preferences/Settings -> Project:...->Python Interpreter 下方点击齿轮图标选择 Add...按钮来指定自定义的位置。按照提示浏览定位到对应版本 python.exe 的绝对地址即可解决问题。 ##### 错误二:权限不足导致 DLL 加载失败 有时即使指定了正确的解释器路径,仍可能遇到由于缺乏适当的操作系统级许可而引发的功能缺失现象。特别是涉及到调用某些特定类型的动态链接库 (Dynamic Link Library, .dll) 时尤为明显。因此拥有管理员身份执行相关动作显得尤为重要——无论是从终端还是图形界面触发创建新 venv 流程均如此处理能够有效规避此类隐患。 ##### 错误三:网络连接异常引起依赖下载超时 部分开发者反馈过因网速慢或者其他因素造成 pip install 操作中途断开进而影响整个项目的初始化进度条卡住的情况。对此可尝试调整镜像源加速获取速度或是离线模式预先准备好所需资源包后再继续后续步骤。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值