博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python基础知识(day3)
阅读量:5103 次
发布时间:2019-06-13

本文共 3242 字,大约阅读时间需要 10 分钟。

一、字符编码与转码

先说python2

  1. py2里默认编码是ascii
  2. 文件开头那个编码声明是告诉解释这个代码的程序 以什么编码格式 把这段代码读入到内存,因为到了内存里,这段代码其实是以bytes二进制格式存的,不过即使是2进制流,也可以按不同的编码格式转成2进制流,你懂么?
  3. 如果在文件头声明了#_*_coding:utf-8_*_,就可以写中文了, 不声明的话,python在处理这段代码时按ascii,显然会出错, 加了这个声明后,里面的代码就全是utf-8格式了
  4. 在有#_*_coding:utf-8*_的情况下,你在声明变量如果写成name=u"大保健",那这个字符就是unicode格式,不加这个u,那你声明的字符串就是utf-8格式
  5. utf-8 to gbk怎么转,utf8先decode成unicode,再encode成gbk

再说python3

  1. py3里默认文件编码就是utf-8,所以可以直接写中文,也不需要文件头声明编码了,干的漂亮
  2. 你声明的变量默认是unicode编码,不是utf-8, 因为默认即是unicode了(不像在py2里,你想直接声明成unicode还得在变量前加个u), 此时你想转成gbk的话,直接your_str.encode("gbk")即可以
  3. 但py3里,你在your_str.encode("gbk")时,感觉好像还加了一个动作,就是就是encode的数据变成了bytes里,我擦,这是怎么个情况,因为在py3里,str and bytes做了明确的区分,你可以理解为bytes就是2进制流,你会说,我看到的不是010101这样的2进制呀, 那是因为python为了让你能对数据进行操作而在内存级别又帮你做了一层封装,否则让你直接看到一堆2进制,你能看出哪个字符对应哪段2进制么?什么?自己换算,得了吧,你连超过2位数的数字加减运算都费劲,还还是省省心吧。  
  4. 那你说,在py2里好像也有bytes呀,是的,不过py2里的bytes只是对str做了个别名(python2里的str就是bytes, py3里的str是unicode),没有像py3一样给你显示的多出来一层封装,但其实其内部还是封装了的。 这么讲吧, 无论是2还是三, 从硬盘到内存,数据格式都是 010101二进制到-->b'\xe4\xbd\xa0\xe5\xa5\xbd' bytes类型-->按照指定编码转成你能看懂的文字

在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string

转码方式如下图所示:

 

1 __author__ = 'NL' 2  3 import sys 4  5 print(sys.getfilesystemencoding()) 6 print(sys.getdefaultencoding()) 7  8 str = "编码测试"  #python3中,默认编码格式为unicode 9 print(str)10 11 str_gbk = str.encode("gbk") #编码的同时,将string转成bytes12 str_decode = str_gbk.decode("gbk")  #解码的同时,将bytes转成string13 print(str_gbk) #输出结果:b'\xb1\xe0\xc2\xeb\xb2\xe2\xca\xd4'14 print(str_decode)
View Code

二、函数

1、函数的基本定义

__author__ = 'NL'   def func1():  #不带参数的函数,无返回值,---》过程    print("func1")        def func2():  #不带参数的函数,有返回值,---》函数    print("func1")    return 0func1()  #函数调用func2()print(func1()) #返回值为Noneprint(func2()) #返回值为0

2、带参数的函数

1 __author__ = 'NL' 2  3 def func1(x,y): 4     z = x + y 5     return z 6  7 def func2(*args): 8     return args 9 10 def func3(**kwargs):11     return kwargs12 13 def func4(x,y=3,*args,**kwargs):14     return x,y,args,kwargs15 16 print(func1(3,4)) #结果为717 print(func2(1,"haha",[1,5,"kkkte"])) #结果为tuple:(1, 'haha', [1, 5, 'kkkte'])18 print(func3(name="nl",age=22,sex="M")) #结果为dict:{'name': 'nl', 'age': 22, 'sex': 'M'}19 print(func4(4,9,"nihao",[1,2,3],name="wqx")) #结果为:(4, 9, ('nihao', [1, 2, 3]), {'name': 'wqx'})

关键参数

正常情况下,给函数传参数要按顺序,不想按顺序就可以用关键参数,只需指定参数名即可,但记住一个要求就是,关键参数必须放在位置参数之后。

 

递归函数

代码演示,二分查找:

 

1 __author__ = 'NL' 2  3 date = [1,2,4,5,7,8,11,12,13,14,15,16,17,18,19,23,36,39,45,66,67,89,203.343] 4  5 def binary_search(date_set,num): 6     mid = int(len(date_set) / 2) 7     if len(date_set)> 1: 8         if num == date_set[mid]: 9             print("找到这个数字了")10         elif num > date_set[mid]:11             print("要找的数字在右边,现在从{}开始向右查找".format(mid))12             binary_search(date_set[mid:],num)13         else:14             print("要找的数字在左边,现在从{}开始向左查找".format(mid))15             binary_search(date_set[:mid],num)16     elif len(date_set) == 1:17         if num == date_set[0]:18             print("找到这个数字了")19         else:20             print("没有找到这个数字")21 22 binary_search(date,66)

递归特性:

1. 必须有一个明确的结束条件

2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

 

转载于:https://www.cnblogs.com/zilin-2017/p/7067888.html

你可能感兴趣的文章
软件包的使用
查看>>
linux中启动与终止lnmp的脚本
查看>>
BZOJ 1304: [CQOI2009]叶子的染色
查看>>
gdb中信号的处理[转]
查看>>
学习Javascript闭包(Closure)
查看>>
LeetCode【709. 转换成小写字母】
查看>>
toString()和toLocaleString()有什么区别
查看>>
【mybatis】学习笔记之conf.xml与mapper.xml配置
查看>>
Python基础学习Day3 数据类型的转换、int、str、bool、字符串的常用方法、for循环...
查看>>
Controller比较两个对象discs、outlets中的元素是否相等。相同则相应的checkbox为checked...
查看>>
Android中在布局中写ViewPager无法渲染出来的问题
查看>>
简单shellcode编写
查看>>
centos7配置yum源
查看>>
winform textbox提示历史记录
查看>>
SSM整合(spring mybatis)图书
查看>>
Linux学习笔记--终端命令
查看>>
关于电脑桌面图标消失并且右键无法点击的情况
查看>>
JAVA窗口2
查看>>
【Alpha】第八次Scrum meeting
查看>>
学习进度条11
查看>>