Python3学习-基础
1.直接运行.py文件
在Windows上是不行的,但是在Mac和Linux上是可以的,方法是在.py文件的第一行加上一个特殊的注释:
- #!/usr/bin/env python3
- print('hello world')
然后,通过命令给hello.py以执行权限:
- $chmod a+x hello.py
2.输入
- name=input()
input()可以显示一个字符串来提示用户:
- name=input('please enter your name')
input()返回的数据类型是str,使用int()将其转换成整数。
3.转义符
如果'是一个字符,那么可以用""括起来。
如果字符串中既包含'又包含",可以用转义字符\来标识。比如:
- 'I \'m \"OK\"'
为了简化,Python允许用r''表示''内部的字符串默认不转义。
'''...'''表示多行内容
4.//表示地板除,只取结果的整数部分。
5.现在计算机通用的字符编码工作方式:在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换成utf-8编码。ord()函数获取字符的整数表示,chr()函数将编码转成对应的字符。
如果知道字符的整数编码,还可以用十六进制这么写str:
- '\u4e2d\u6587'
- '中文'
两种写法是完全等价的。
由于Python的字符串类型是str,在内存中以Unicode表示,一个字符对应若干个字节。如果要在网络中传输或者保存到磁盘上,就需要把str变成以字节为单位的bytes。Python对bytes类型的数据用带b前缀的单引号或双引号表示:
- x=b'ABC'
要注意区分'ABC'
和b'ABC'
,前者是str
,后者虽然内容显示得和前者一样,但bytes
的每个字符都只占用一个字节。
以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:
- 'ABC'.encode('ascii')
- '中文'.encode('utf-8')
- '中文'.encode('ascii')
- b('ABC')
- b('\xe4\xb8\xad\xe6\x96\x87')
- 报错
纯英文的str
可以用ASCII
编码为bytes
,内容是一样的,含有中文的str
可以用UTF-8
编码为bytes
。含有中文的str
无法用ASCII
编码,因为中文编码的范围超过了ASCII
编码的范围,Python会报错。
反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes
。要把bytes
变为str
,就需要用decode()
方法:
- b'ABC'.decode('ascii')
- 'ABC'
- b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
- '中文'
由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:
- #!/usr/bin/env python3
- #-*- coding:utf-8 -*-
6.格式化
- ‘Hell0,%s' % 'world'
- 'Hello,%s, you have $%d' % ('Michael',1000)
%d %f %s %x
格式化整数和浮点数还可以指定是否补0和整数与小数的位数:
- '%2d-%02d'%(3,1)
- ' 3-01'
- '%.2f'%3.1415926
- '3.14'
%%转义,表示一个%
7.list删除指定位置的元素,使用pop(i)方法:
- classmates.pop(1)
i是索引位置。
要把某个元素替换成别的元素,可以直接赋值给对应的索引位置:
- classmate[1]='Sarah'
list中的数据类型可以不同,list中的元素也可以是另一个list。此时,含有list的list可以看成是一个二维数组。
8.tuple
另一种有序列表叫元组:tuple。tuple和list非常相似,但是tuple一旦初始化就不能修改。
- classmates=('Michael','Bob','Tracy')
- t=(1)
上面的代码定义的不是tuple,而是一个数。为了消除歧义:
- t=(1,)
当tuple中含有list的时候,list中的元素时可以改变的,但是tuple中list的指向是不可以变化的。
9.if x 如果x是非零数值、非空字符串、非空list,就可以判断为True。
10.dict根据key来计算value的存储位置,哈希算法,所以key的对象不能变,list不可以作为key。
11.set是key的集合,不存储value。add() remove()。可以看成数学意义上的无序和无重复元素的集合,可以做数学意义上的交集和并集操作:
- s1=set([1,2,3])
- s2=set([2,3,4])
- s1&s2
- s1|s2
12.如果想定义一个什么事也不做的空函数,可以使用pass语句。
- def nop():
- pass
pass
语句什么都不做,那有什么用?实际上pass
可以用来作为占位符,比如现在还没想好怎么写函数的代码,就可以先放一个pass
,让代码能运行起来。pass还可以用在其他的语句里:
- if age>=18:
- pass
13.对参数类型进行检查:
- if not isinstance(x,(int,float)):
- raise TypeError('bad operand type')
14.函数的返回值实际上是一个tuple,多个变量可以同时接收一个tuple,按位置赋给对应的值。
15.默认参数必须指向不可变对象,L=[],为list,是一个可变的对象,每次调用的时候会记忆之前的list。
16.定义可变参数。
- def calc(*numbers):
- sum=0
- for n in numbers:
- sum+=n*n
- return sum
如果已经有一个list或者tuple,要调用一个可变参数:
- nums=[1,2,3]
- calc(*nums)
表示把nums这个list的所有元素作为可变参数传进去。
17.关键字参数
关键字参数有扩展函数的功能。
- extra={'city':'Beijing','job':'Engineer'}
person('Jack',24,**extra)
**extra
表示把extra
这个dict的所有key-value用关键字参数传入到函数的**kw
参数,kw
将获得一个dict,注意kw
获得的dict是extra
的一份拷贝,对kw
的改动不会影响到函数外的extra
。
18.命名关键字参数
对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过kw
检查。
仍以person()
函数为例,我们希望检查是否有city
和job
参数:
- def person(name, age, **kw):
- if 'city' in kw:
- # 有city参数
- pass
- if 'job' in kw:
- # 有job参数
- pass
- print('name:', name, 'age:', age, 'other:', kw)
如果要限制关键字参数的名字,使用命名关键字参数:
- def person(name, age, *, city, job):
- print(name, age, city, job)
和关键字参数**kw
不同,命名关键字参数需要一个特殊分隔符*
,*
后面的参数被视为命名关键字参数。
调用方式如下:
- person('Jack', 24, city='Beijing', job='Engineer')
- Jack 24 Beijing Engineer
如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*
了:
- def person(name, age, *args, city, job):
- print(name, age, args, city, job)
命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错。
19.参数组合
参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数、关键字参数
- def f1(a,b,c=0,*args,**kw):
- print ('a=',a,'b=',b,'c=',c,'args=',args,'kw=',kw)
- def f2(a,b,c=0,*,d,**kw):
- print ('a=',a,'b=',b,'c=',c,'d=',d,'kw=',kw)
在函数调用的时候,Python解释器自动按照参数位置和参数名把对应的参数传进去:
- f1(1, 2)
- a = 1 b = 2 c = 0 args = () kw = {}
- f1(1, 2, c=3)
- a = 1 b = 2 c = 3 args = () kw = {}
- f1(1, 2, 3, 'a', 'b')
- a = 1 b = 2 c = 3 args = ('a', 'b') kw = {}
- f1(1, 2, 3, 'a', 'b', x=99)
- a = 1 b = 2 c = 3 args = ('a', 'b') kw = {'x': 99}
- f2(1, 2, d=99, ext=None)
- a = 1 b = 2 c = 0 d = 99 kw = {'ext': None}
通过一个tuple和dict,也可以调用上述函数:
- args = (1, 2, 3, 4)
- kw = {'d': 99, 'x': '#'}
- f1(*args, **kw)
- a = 1 b = 2 c = 3 args = (4,) kw = {'d': 99, 'x': '#'}
- args = (1, 2, 3)
- kw = {'d': 88, 'x': '#'}
- f2(*args, **kw)
- a = 1 b = 2 c = 3 d = 88 kw = {'x': '#'}
对于任意函数,都可以通过类似func(*args, **kw)
的形式调用它,无论它的参数是如何定义的。
*args
是可变参数,args接收的是一个tuple;
**kw
是关键字参数,kw接收的是一个dict。
20.解决递归调用栈溢出的方法是通过尾递归优化。尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。
- def fact(n):
- return fact_iter(n, 1)
- def fact_iter(num, product):
- if num == 1:
- return product
- return fact_iter(num - 1, num * product)
Python3学习-基础的更多相关文章
- Python3学习(1)-基础篇
Python3学习(1)-基础篇 Python3学习(2)-中级篇 Python3学习(3)-高级篇 安装(MAC) 直接运行: brew install python3 输入:python3 --v ...
- Python3学习(3)-高级篇
Python3学习(1)-基础篇 Python3学习(2)-中级篇 Python3学习(3)-高级篇 文件读写 源文件test.txt line1 line2 line3 读取文件内容 f = ope ...
- Python3学习(2)-中级篇
Python3学习(1)-基础篇 Python3学习(2)-中级篇 Python3学习(3)-高级篇 切片:取数组.元组中的部分元素 L=['Jack','Mick','Leon','Jane','A ...
- Python学习基础笔记(全)
换博客了,还是csdn好一些. Python学习基础笔记 1.Python学习-linux下Python3的安装 2.Python学习-数据类型.运算符.条件语句 3.Python学习-循环语句 4. ...
- Python3学习之路~0 目录
目录 Python3学习之路~2.1 列表.元组操作 Python3学习之路~2.2 简单的购物车程序 Python3学习之路~2.3 字符串操作 Python3学习之路~2.4 字典操作 Pytho ...
- 现代3D图形编程学习-基础简介(2) (译)
本书系列 现代3D图形编程学习 基础简介(2) 图形和渲染 接下去的内容对渲染的过程进行粗略介绍.遇到的部分内容不是很明白也没有关系,在接下去的章节中,会被具体阐述. 你在电脑屏幕上看到的任何东西,包 ...
- 现代3D图形编程学习-基础简介(1) (译)
本书系列 现代3D图形编程学习 基础简介 并不像本书的其他章节,这章内容没有相关的源代码或是项目.本章,我们将讨论向量,图形渲染理论,以及OpenGL. 向量 在阅读这本书的时候,你需要熟悉代数和几何 ...
- JavaScript学习基础部分
JavaScript学习基础 一.简介 1.JavaScript 是因特网上最流行的脚本语言,并且可在所有主要的浏览器中运行,比方说 Internet Explorer. Mozilla.Firefo ...
- Python3学习笔记(urllib模块的使用)转http://www.cnblogs.com/Lands-ljk/p/5447127.html
Python3学习笔记(urllib模块的使用) 1.基本方法 urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, ...
随机推荐
- Java IO编程——字符流与字节流
在java.io包里面File类是唯一 一个与文件本身有关的程序处理类,但是File只能够操作文件本身而不能够操作文件的内容,或者说在实际的开发之中IO操作的核心意义在于:输入与输出操作.而对于程序而 ...
- 在k8s上安装Jenkins及常见问题
持续集成和部署是DevOps的重要组成部分,Jenkins是一款非常流行的持续集成和部署工具,最近试验了一下Jenkins,发现它是我一段时间以来用过的工具中最复杂的.一个可能的原因是它需要与各种其它 ...
- GUI编程(Tkinter) 笔记分享
Python GUI编程(Tkinter) Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的 ...
- Linux系统运行级别和关机重启命令介绍
Linux系统运行级别介绍 Linux系统有七种运行级别(Run Level),各个运行级别下,系统有不同的状态,各个级别的意义描述如下. 0:关键级别1:单用户运行级别,运行rc.sysinit和r ...
- Pytorch数据集读入——Dataset类,实现数据集打乱Shuffle
在进行相关平台的练习过程中,由于要自己导入数据集,而导入方法在市面上五花八门,各种库都可以应用,在这个过程中我准备尝试torchvision的库dataset torchvision.datasets ...
- 哪种方式更适合在React中获取数据?
作者:Dmitri Pavlutin 译者:小维FE 原文:dmitripavlutin.com 国外文章,笔者采用意译的方式,以保证文章的可读性. 当执行像数据获取这样的I/O操作时,你必须发起获取 ...
- 分布式id生成方案总结
本文已经收录自 JavaGuide (60k+ Star[Java学习+面试指南] 一份涵盖大部分Java程序员所需要掌握的核心知识.) 本文授权转载自:https://juejin.im/post/ ...
- [2018-06-27] virtualenv
在开发Python应用程序的时候,系统安装的Python只有一个版本:3.4.所有第三方的包都会被pip安装到Python3的site-packages目录下. 如果我们要同时开发多个应用程序,那这些 ...
- Scrapy爬取豆瓣图书数据并写入MySQL
项目地址 BookSpider 介绍 本篇涉及的内容主要是获取分类下的所有图书数据,并写入MySQL 准备 Python3.6.Scrapy.Twisted.MySQLdb等 演示 代码 一.创建项目 ...
- Java中打印日志,这4点很重要!
目录 一.预先判断日志级别 二.避免无效日志打印 三.区别对待错误日志 四.保证记录完整内容 打印日志,要注意下面4点. 一.预先判断日志级别 对DEBUG.INFO级别的日志,必须使用条件输出或者使 ...